diff --git a/src/main/java/com/imprimelibros/erp/error/ErrorPageController.java b/src/main/java/com/imprimelibros/erp/error/ErrorPageController.java new file mode 100644 index 0000000..725eb5e --- /dev/null +++ b/src/main/java/com/imprimelibros/erp/error/ErrorPageController.java @@ -0,0 +1,47 @@ +package com.imprimelibros.erp.error; + +import jakarta.servlet.RequestDispatcher; +import jakarta.servlet.http.HttpServletRequest; +import org.springframework.boot.web.servlet.error.ErrorController; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; +import com.imprimelibros.erp.common.Utils; + +import java.time.ZonedDateTime; + +@Controller +public class ErrorPageController implements ErrorController { + + @RequestMapping("/error") + public String handleError(HttpServletRequest request, Model model) { + + Object statusObj = request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE); + Integer statusCode = statusObj != null ? Integer.valueOf(statusObj.toString()) : 500; + + HttpStatus status = HttpStatus.resolve(statusCode); + if (status == null) status = HttpStatus.INTERNAL_SERVER_ERROR; + + Object message = request.getAttribute(RequestDispatcher.ERROR_MESSAGE); + Object exception = request.getAttribute(RequestDispatcher.ERROR_EXCEPTION); + Object path = request.getAttribute(RequestDispatcher.ERROR_REQUEST_URI); + + model.addAttribute("status", status.value()); + model.addAttribute("error", status.getReasonPhrase()); + model.addAttribute("message", message != null ? message : ""); + model.addAttribute("path", path != null ? path : ""); + model.addAttribute("timestamp", ZonedDateTime.now()); + + // Puedes usar esto para cambiar iconos/texto según status + model.addAttribute("is404", status == HttpStatus.NOT_FOUND); + model.addAttribute("is403", status == HttpStatus.FORBIDDEN); + model.addAttribute("is500", status.is5xxServerError()); + + if(Utils.isCurrentUserAdmin()) + // una sola vista para todos los errores + return "imprimelibros/error/error"; + else + return "redirect:/"; // redirige a home para usuarios no admin + } +} \ No newline at end of file diff --git a/src/main/java/com/imprimelibros/erp/pedidos/PedidoLinea.java b/src/main/java/com/imprimelibros/erp/pedidos/PedidoLinea.java index 6b8a7d0..7679978 100644 --- a/src/main/java/com/imprimelibros/erp/pedidos/PedidoLinea.java +++ b/src/main/java/com/imprimelibros/erp/pedidos/PedidoLinea.java @@ -14,14 +14,16 @@ public class PedidoLinea { procesando_pago("pedido.estado.procesando_pago", 2), denegado_pago("pedido.estado.denegado_pago", 3), aprobado("pedido.estado.aprobado", 4), - maquetacion("pedido.estado.maquetacion", 5), - haciendo_ferro("pedido.estado.haciendo_ferro", 6), - esperando_aceptacion_ferro("pedido.estado.esperando_aceptacion_ferro", 7), - ferro_cliente("pedido.estado.ferro_cliente", 8), - produccion("pedido.estado.produccion", 9), - terminado("pedido.estado.terminado", 10), - enviado("pedido.estado.enviado", 11), - cancelado("pedido.estado.cancelado", 12); + procesando_pedido("pedido.estado.procesando_pedido", 5), + maquetacion("pedido.estado.maquetacion", 6), + haciendo_ferro_digital("pedido.estado.haciendo_ferro_digital", 7), + esperando_aceptacion_ferro_digital("pedido.estado.esperando_aceptacion_ferro_digital", 8), + haciendo_ferro("pedido.estado.haciendo_ferro", 9), + esperando_aceptacion_ferro("pedido.estado.esperando_aceptacion_ferro", 10), + produccion("pedido.estado.produccion", 11), + terminado("pedido.estado.terminado", 12), + enviado("pedido.estado.enviado", 13), + cancelado("pedido.estado.cancelado", 14); private final String messageKey; private final int priority; diff --git a/src/main/java/com/imprimelibros/erp/pedidos/PedidoService.java b/src/main/java/com/imprimelibros/erp/pedidos/PedidoService.java index 1a59055..342998f 100644 --- a/src/main/java/com/imprimelibros/erp/pedidos/PedidoService.java +++ b/src/main/java/com/imprimelibros/erp/pedidos/PedidoService.java @@ -271,7 +271,7 @@ public class PedidoService { Integer counter = 1; for (PedidoLinea linea : lineas) { if (linea.getEstado() == Estado.pendiente_pago - || linea.getEstado() == Estado.denegado_pago) { + || linea.getEstado() == Estado.denegado_pago || linea.getEstado() == Estado.procesando_pago) { Presupuesto presupuesto = linea.getPresupuesto(); linea.setEstado(getEstadoInicial(presupuesto)); @@ -311,6 +311,7 @@ public class PedidoService { return true; } + @Transactional public Map actualizarEstado(Long pedidoLineaId, Locale locale) { PedidoLinea pedidoLinea = pedidoLineaRepository.findById(pedidoLineaId).orElse(null); @@ -327,8 +328,8 @@ public class PedidoService { "message", messageSource.getMessage("pedido.errors.cannot-update", null, locale)); } - // Rango: >= haciendo_ferro y < enviado - if (estadoOld.getPriority() < PedidoLinea.Estado.haciendo_ferro.getPriority() + // Rango: >= procesando_pedido y < enviado + if (estadoOld.getPriority() < PedidoLinea.Estado.procesando_pedido.getPriority() || estadoOld.getPriority() >= PedidoLinea.Estado.enviado.getPriority()) { return Map.of( "success", false, @@ -788,7 +789,7 @@ public class PedidoService { if (presupuestoService.hasMaquetacion(p)) { return Estado.maquetacion; } else { - return Estado.haciendo_ferro; + return Estado.procesando_pedido; } } diff --git a/src/main/java/com/imprimelibros/erp/presupuesto/PresupuestoController.java b/src/main/java/com/imprimelibros/erp/presupuesto/PresupuestoController.java index 2dfaefc..7f92b0d 100644 --- a/src/main/java/com/imprimelibros/erp/presupuesto/PresupuestoController.java +++ b/src/main/java/com/imprimelibros/erp/presupuesto/PresupuestoController.java @@ -48,12 +48,12 @@ 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.dto.Presupuesto; +import com.imprimelibros.erp.presupuesto.dto.PresupuestoFormDataMapper; +import com.imprimelibros.erp.presupuesto.dto.PresupuestoFormDataMapper.PresupuestoFormDataDto; import com.imprimelibros.erp.presupuesto.service.PresupuestoService; import com.imprimelibros.erp.presupuesto.validation.PresupuestoValidationGroups; import com.imprimelibros.erp.users.UserDao; import com.imprimelibros.erp.users.UserDetailsImpl; -import com.imprimelibros.erp.presupuesto.service.PresupuestoFormDataMapper; -import com.imprimelibros.erp.presupuesto.service.PresupuestoFormDataMapper.PresupuestoFormDataDto; import com.imprimelibros.erp.common.Utils; import com.imprimelibros.erp.common.web.IpUtils; 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 d236332..79bb623 100644 --- a/src/main/java/com/imprimelibros/erp/presupuesto/dto/Presupuesto.java +++ b/src/main/java/com/imprimelibros/erp/presupuesto/dto/Presupuesto.java @@ -284,6 +284,9 @@ public class Presupuesto extends AbstractAuditedEntity implements Cloneable { @Column(name = "lomo") private Double lomo; + @Column(name = "lomo_cubierta") + private Double lomoCubierta; + @NotNull(message = "{presupuesto.errores.gramaje-interior}", groups = PresupuestoValidationGroups.Interior.class) @Column(name = "gramaje_interior") private Integer gramajeInterior; @@ -731,6 +734,14 @@ public class Presupuesto extends AbstractAuditedEntity implements Cloneable { this.lomo = lomo; } + public Double getLomoCubierta() { + return lomoCubierta; + } + + public void setLomoCubierta(Double lomoCubierta) { + this.lomoCubierta = lomoCubierta; + } + public Integer getGramajeInterior() { return gramajeInterior; } diff --git a/src/main/java/com/imprimelibros/erp/presupuesto/service/PresupuestoFormDataMapper.java b/src/main/java/com/imprimelibros/erp/presupuesto/dto/PresupuestoFormDataMapper.java similarity index 98% rename from src/main/java/com/imprimelibros/erp/presupuesto/service/PresupuestoFormDataMapper.java rename to src/main/java/com/imprimelibros/erp/presupuesto/dto/PresupuestoFormDataMapper.java index a2abfc9..9a1ff32 100644 --- a/src/main/java/com/imprimelibros/erp/presupuesto/service/PresupuestoFormDataMapper.java +++ b/src/main/java/com/imprimelibros/erp/presupuesto/dto/PresupuestoFormDataMapper.java @@ -1,9 +1,7 @@ -package com.imprimelibros.erp.presupuesto.service; +package com.imprimelibros.erp.presupuesto.dto; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; -import com.imprimelibros.erp.presupuesto.dto.Presupuesto; - import org.springframework.stereotype.Service; @@ -21,6 +19,7 @@ public class PresupuestoFormDataMapper { public Servicios servicios = new Servicios(); public Integer selectedTirada; public Double lomo; + public Double lomoCubierta; // ===== Datos Generales ===== public static class DatosGenerales { @@ -194,7 +193,10 @@ public class PresupuestoFormDataMapper { // ===== Selected tirada vm.selectedTirada = p.getSelectedTirada(); + + // ===== Lomos vm.lomo = p.getLomo(); + vm.lomoCubierta = p.getLomoCubierta(); // ===== Servicios desde JSONs vm.servicios.servicios = parse(p.getServiciosJson(), diff --git a/src/main/resources/db/changelog/changesets/0028-add-lomo-cubierta-to-presupuesto.yml b/src/main/resources/db/changelog/changesets/0028-add-lomo-cubierta-to-presupuesto.yml new file mode 100644 index 0000000..e78350c --- /dev/null +++ b/src/main/resources/db/changelog/changesets/0028-add-lomo-cubierta-to-presupuesto.yml @@ -0,0 +1,18 @@ +databaseChangeLog: + - changeSet: + id: 0028-add-lomo-cubierta-to-presupuesto + author: jjo + changes: + - addColumn: + tableName: presupuesto + columns: + - column: + name: lomo_cubierta + type: DECIMAL(12, 2) + defaultValueNumeric: 0 + afterColumn: lomo + + rollback: + - dropColumn: + tableName: presupuesto + columnName: lomo_cubierta diff --git a/src/main/resources/db/changelog/changesets/0029-update-estados-pedidos-lineas.yml b/src/main/resources/db/changelog/changesets/0029-update-estados-pedidos-lineas.yml new file mode 100644 index 0000000..f703d65 --- /dev/null +++ b/src/main/resources/db/changelog/changesets/0029-update-estados-pedidos-lineas.yml @@ -0,0 +1,43 @@ +databaseChangeLog: + - changeSet: + id: 0029-update-estados-pedidos-lineas + author: jjo + changes: + - modifyDataType: + tableName: pedidos_lineas + columnName: estado + newDataType: > + enum( + 'pendiente_pago', + 'procesando_pago', + 'denegado_pago', + 'aprobado', + 'procesando_pedido', + 'maquetacion', + 'haciendo_ferro_digital', + 'esperando_aceptacion_ferro_digital', + 'haciendo_ferro', + 'esperando_aceptacion_ferro', + 'produccion', + 'terminado', + 'enviado', + 'cancelado' + ) + rollback: + - modifyDataType: + tableName: pedidos_lineas + columnName: estado + newDataType: > + enum( + 'pendiente_pago', + 'procesando_pago', + 'denegado_pago', + 'aprobado', + 'maquetacion', + 'haciendo_ferro', + 'esperando_aceptacion_ferro', + 'produccion', + 'terminado', + 'enviado', + 'cancelado' + ) diff --git a/src/main/resources/db/changelog/master.yml b/src/main/resources/db/changelog/master.yml index 0d20e29..5a361d8 100644 --- a/src/main/resources/db/changelog/master.yml +++ b/src/main/resources/db/changelog/master.yml @@ -1,4 +1,4 @@ -databaseChangeLog: +databaseChangeLog: - include: file: db/changelog/changesets/0001-baseline.yml - include: @@ -53,3 +53,8 @@ databaseChangeLog: file: db/changelog/changesets/0026-drop-entrega-tipo-from-presupuesto.yml - include: file: db/changelog/changesets/0027-add-lomo-to-presupuesto.yml + - include: + file: db/changelog/changesets/0028-add-lomo-cubierta-to-presupuesto.yml + - include: + file: db/changelog/changesets/0029-update-estados-pedidos-lineas.yml + diff --git a/src/main/resources/i18n/pedidos_es.properties b/src/main/resources/i18n/pedidos_es.properties index c770f4c..376c7bb 100644 --- a/src/main/resources/i18n/pedidos_es.properties +++ b/src/main/resources/i18n/pedidos_es.properties @@ -22,10 +22,12 @@ pedido.estado.pendiente_pago=Pendiente de pago pedido.estado.procesando_pago=Procesando pago pedido.estado.denegado_pago=Pago denegado pedido.estado.aprobado=Aprobado +pedido.estado.procesando_pedido=Procesando pedido pedido.estado.maquetacion=Maquetación -pedido.estado.haciendo_ferro=Haciendo ferro -pedido.estado.esperando_aceptacion_ferro=Esperando aceptación de ferro -pedido.estado.ferro_cliente=Esperando aprobación de ferro +pedido.estado.haciendo_ferro_digital=Haciendo ferro digital +pedido.estado.esperando_aceptacion_ferro_digital=Esperando aceptación de ferro digital +pedido.estado.haciendo_ferro=Haciendo ejemplar de prueba +pedido.estado.esperando_aceptacion_ferro=Esperando aceptación de ejemplar de prueba pedido.estado.produccion=Producción pedido.estado.terminado=Terminado pedido.estado.enviado=Enviado 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 2584bd7..2a29b52 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 @@ -107,7 +107,8 @@ export default class PresupuestoWizard { } }, selectedTirada: 10, - lomo: 0 + lomo: 0, + lomoCubierta: 0 } // pestaña datos generales @@ -445,7 +446,8 @@ export default class PresupuestoWizard { ...this.#getInteriorData(), ...this.#getCubiertaData(), selectedTirada: this.formData.selectedTirada, - lomo: this.formData.lomo + lomo: this.formData.lomo, + lomoCubierta: this.formData.lomoCubierta }; const sobrecubierta = data.sobrecubierta; diff --git a/src/main/resources/templates/imprimelibros/error/error.html b/src/main/resources/templates/imprimelibros/error/error.html new file mode 100644 index 0000000..ee62b9d --- /dev/null +++ b/src/main/resources/templates/imprimelibros/error/error.html @@ -0,0 +1,61 @@ + + + + + + + + + + + + + +
+
+ + + +
+
+
+
+ +

404

+

Not Found

+ +

+ Ha ocurrido un error inesperado. +

+ +
+
Ruta: /logout
+
Fecha: --
+
+ + + + +
+
+ No se ha encontrado el recurso solicitado. +
+
+ +
+
+
+
+
+ +
+ + + \ No newline at end of file