mirror of
https://git.imnavajas.es/jjimenez/erp-imprimelibros.git
synced 2026-01-13 00:48:49 +00:00
terminado
This commit is contained in:
1924
logs/erp.log
1924
logs/erp.log
File diff suppressed because one or more lines are too long
@ -576,6 +576,42 @@ public class skApiClient {
|
||||
return Boolean.parseBoolean(result);
|
||||
}
|
||||
|
||||
|
||||
public Boolean cancelarPedido(Long pedidoId) {
|
||||
|
||||
String result = performWithRetry(() -> {
|
||||
String url = this.skApiUrl + "api/cancelar-pedido/" + pedidoId;
|
||||
|
||||
HttpHeaders headers = new HttpHeaders();
|
||||
headers.setContentType(MediaType.APPLICATION_JSON);
|
||||
headers.setBearerAuth(authService.getToken());
|
||||
|
||||
HttpEntity<Void> entity = new HttpEntity<>(headers);
|
||||
|
||||
ResponseEntity<String> response = restTemplate.exchange(
|
||||
url,
|
||||
HttpMethod.POST,
|
||||
entity,
|
||||
String.class);
|
||||
|
||||
try {
|
||||
Map<String, Object> responseBody = new ObjectMapper().readValue(
|
||||
response.getBody(),
|
||||
new TypeReference<Map<String, Object>>() {
|
||||
});
|
||||
|
||||
Boolean success = (Boolean) (responseBody.get("success") != null ? responseBody.get("success") : false);
|
||||
|
||||
return success.toString();
|
||||
|
||||
} catch (JsonProcessingException e) {
|
||||
e.printStackTrace();
|
||||
return "false"; // Fallback en caso de error
|
||||
}
|
||||
});
|
||||
return Boolean.parseBoolean(result);
|
||||
}
|
||||
|
||||
/******************
|
||||
* PRIVATE METHODS
|
||||
******************/
|
||||
|
||||
@ -355,9 +355,35 @@ public class PedidoService {
|
||||
pedidoLineaRepository.save(pedidoLinea);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
public Boolean cancelarPedido(Long pedidoId) {
|
||||
|
||||
Pedido pedido = pedidoRepository.findById(pedidoId).orElse(null);
|
||||
if (pedido == null) {
|
||||
return false;
|
||||
}
|
||||
Boolean result = skApiClient.cancelarPedido(Long.valueOf(pedido.getProveedorRef()));
|
||||
if (!result) {
|
||||
return false;
|
||||
}
|
||||
List<PedidoLinea> lineas = pedidoLineaRepository.findByPedidoId(pedidoId);
|
||||
for (PedidoLinea linea : lineas) {
|
||||
if (linea.getEstado() != PedidoLinea.Estado.terminado) {
|
||||
linea.setEstado(PedidoLinea.Estado.cancelado);
|
||||
pedidoLineaRepository.save(linea);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/***************************
|
||||
* MÉTODOS PRIVADOS
|
||||
***************************/
|
||||
|
||||
private byte[] downloadFile(Long pedidoLineaId, String fileType, Locale locale) {
|
||||
PedidoLinea pedidoLinea = pedidoLineaRepository.findById(pedidoLineaId).orElse(null);
|
||||
if (pedidoLinea == null) {
|
||||
|
||||
@ -211,6 +211,15 @@ public class PedidosController {
|
||||
@PathVariable(name = "id", required = true) Long id,
|
||||
Model model, Locale locale) {
|
||||
|
||||
List<String> keys = List.of(
|
||||
"app.cancelar",
|
||||
"app.yes",
|
||||
"pedido.view.cancel-title",
|
||||
"pedido.view.cancel-text");
|
||||
|
||||
Map<String, String> translations = translationService.getTranslations(locale, keys);
|
||||
model.addAttribute("languageBundle", translations);
|
||||
|
||||
Boolean isAdmin = Utils.isCurrentUserAdmin();
|
||||
if (isAdmin) {
|
||||
model.addAttribute("isAdmin", true);
|
||||
@ -226,6 +235,7 @@ public class PedidosController {
|
||||
|
||||
model.addAttribute("direccionFacturacion", direccionFacturacion);
|
||||
|
||||
Boolean showCancel = false;
|
||||
List<Map<String, Object>> lineas = pedidoService.getLineas(id, locale);
|
||||
for (Map<String, Object> linea : lineas) {
|
||||
|
||||
@ -252,6 +262,10 @@ public class PedidosController {
|
||||
}
|
||||
linea.put("buttons", buttons);
|
||||
}
|
||||
|
||||
if(pedidoLinea.getEstado() != PedidoLinea.Estado.cancelado && pedidoLinea.getEstado() != PedidoLinea.Estado.terminado) {
|
||||
showCancel = true;
|
||||
}
|
||||
}
|
||||
|
||||
List<PedidoDireccion> dirEntrega = pedidoService.getDireccionesEntregaPedidoLinea(
|
||||
@ -267,10 +281,30 @@ public class PedidosController {
|
||||
|
||||
}
|
||||
model.addAttribute("lineas", lineas);
|
||||
model.addAttribute("showCancel", showCancel);
|
||||
model.addAttribute("id", id);
|
||||
return "imprimelibros/pedidos/pedidos-view";
|
||||
}
|
||||
|
||||
@PostMapping("/cancel/{id}")
|
||||
@ResponseBody
|
||||
public Map<String, Object> cancelPedido(
|
||||
@PathVariable(name = "id", required = true) Long id,
|
||||
Locale locale) {
|
||||
Boolean result = pedidoService.cancelarPedido(id);
|
||||
if (result) {
|
||||
String successMsg = messageSource.getMessage("pedido.success.pedido-cancelado", null, locale);
|
||||
return Map.of(
|
||||
"success", true,
|
||||
"message", successMsg);
|
||||
} else {
|
||||
String errorMsg = messageSource.getMessage("pedido.errors.cancel-pedido", null, locale);
|
||||
return Map.of(
|
||||
"success", false,
|
||||
"message", errorMsg);
|
||||
}
|
||||
}
|
||||
|
||||
// -------------------------------------
|
||||
// Acciones sobre las lineas de pedido
|
||||
// -------------------------------------
|
||||
|
||||
@ -56,11 +56,16 @@ pedido.view.aceptar-ferro=Aceptar ferro
|
||||
pedido.view.ferro-download=Descargar ferro
|
||||
pedido.view.cub-download=Descargar cubierta
|
||||
pedido.view.tapa-download=Descargar tapa
|
||||
pedido.view.admin-actions=Acciones de administrador
|
||||
pedido.view.cancel-title=¿Estás seguro de que deseas cancelar este pedido?
|
||||
pedido.view.cancel-text=Esta acción no se puede deshacer.
|
||||
|
||||
pedido.errors.linea-not-found=No se ha encontrado la línea de pedido.
|
||||
pedido.errors.cancel-pedido=Error al cancelar el pedido
|
||||
pedido.errors.state-error=Estado de línea no válido.
|
||||
pedido.errors.update-server-error=Error al actualizar el estado desde el servidor externo.
|
||||
pedido.errors.connecting-server-error=Error al conectar con el servidor externo.
|
||||
pedido.errors.cannot-update=No se puede actualizar el estado de una línea con ese estado inicial.
|
||||
pedido.success.estado-actualizado=Estado del pedido actualizado correctamente.
|
||||
pedido.success.same-estado=Sin cambios en el estado.
|
||||
pedido.success.pedido-cancelado=Pedido cancelado correctamente.
|
||||
@ -141,6 +141,79 @@ $(() => {
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$(document).on('click', '.btn-cancel-pedido', function () {
|
||||
const pedidoId = $(this).data('pedido-id');
|
||||
if (!pedidoId) {
|
||||
console.error('No se ha encontrado el ID del pedido.');
|
||||
return;
|
||||
}
|
||||
|
||||
Swal.fire({
|
||||
title: window.languageBundle['pedido.view.cancel-title'] || '¿Estás seguro de que deseas cancelar este pedido?',
|
||||
text: window.languageBundle['pedido.view.cancel-text'] || "Esta acción no se puede deshacer.",
|
||||
icon: 'warning',
|
||||
showCancelButton: true,
|
||||
confirmButtonText: window.languageBundle['app.yes'] || 'Sí, cancelar pedido',
|
||||
cancelButtonText: window.languageBundle['app.cancel'] || 'No, mantener pedido',
|
||||
buttonsStyling: false,
|
||||
customClass: {
|
||||
confirmButton: 'btn btn-danger me-2',
|
||||
cancelButton: 'btn btn-light'
|
||||
}
|
||||
}).then((result) => {
|
||||
if (result.isConfirmed) {
|
||||
// Llamada AJAX para cancelar el pedido
|
||||
$.ajax({
|
||||
url: `/pedidos/cancel/${pedidoId}`,
|
||||
type: 'POST',
|
||||
success: function (response) {
|
||||
if (!response || !response.success) {
|
||||
Swal.fire({
|
||||
icon: 'error',
|
||||
title: response.message || "Error",
|
||||
timer: 1800,
|
||||
buttonsStyling: false,
|
||||
customClass: {
|
||||
confirmButton: 'btn btn-secondary me-2',
|
||||
cancelButton: 'btn btn-light'
|
||||
},
|
||||
showConfirmButton: false
|
||||
});
|
||||
}
|
||||
else {
|
||||
Swal.fire({
|
||||
icon: 'success',
|
||||
title: response.message || "Éxito",
|
||||
timer: 1800,
|
||||
buttonsStyling: false,
|
||||
customClass: {
|
||||
confirmButton: 'btn btn-secondary me-2',
|
||||
cancelButton: 'btn btn-light'
|
||||
},
|
||||
showConfirmButton: false
|
||||
}).then((result) => {
|
||||
if (result.dismiss === Swal.DismissReason.timer) {
|
||||
location.reload();
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
error: function (xhr, status, error) {
|
||||
console.error('Error al cancelar el pedido:', error);
|
||||
Swal.fire({
|
||||
icon: 'error',
|
||||
title: xhr.responseJSON?.message || 'Error',
|
||||
buttonsStyling: false,
|
||||
customClass: {
|
||||
confirmButton: 'btn btn-secondary me-2', // clases para el botón confirmar
|
||||
cancelButton: 'btn btn-light' // clases para cancelar
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
})
|
||||
@ -134,14 +134,6 @@
|
||||
<div class="row align-items-center gy-3">
|
||||
<div class="col-sm">
|
||||
<div class="d-flex flex-wrap my-n1">
|
||||
<!-- Botón cancelar -->
|
||||
<div th:if="${item.estado.name != 'cancelado' && item.estado.name != 'terminado'}">
|
||||
<a href="javascript:void(0);" class="d-block text-body p-1 px-2 cancel-item"
|
||||
th:attr="data-linea-id=${item.lineaId}">
|
||||
<i class="ri-delete-bin-fill text-muted align-bottom me-1"><span
|
||||
th:text="#{pedido.cancelar}">Cancelar Pedido</span></i>
|
||||
</a>
|
||||
</div>
|
||||
<!-- Actualizar estado-->
|
||||
<div class="update-estado-button"
|
||||
th:if="${item.estado.name != 'cancelado' && item.estado.name != 'maquetacion' && item.estado.name != 'terminado'}">
|
||||
|
||||
@ -44,7 +44,25 @@
|
||||
)}">
|
||||
</div>
|
||||
</div>
|
||||
<th:block th:if="${isAdmin and showCancel}">
|
||||
<div sec:authorize="isAuthenticated() and hasAnyRole('SUPERADMIN','ADMIN')"
|
||||
class="col-12 col-md-auto">
|
||||
<div class="card card border mb-3 admin-actions">
|
||||
<div class="card-header bg-light">
|
||||
<span class="fs-16" th:text="#{'pedido.view.admin-actions'}"></span>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<button type="button" class="btn btn-danger w-100 btn-cancel-pedido"
|
||||
th:text="#{pedido.cancelar}" th:attr="data-pedido-id=${id}">
|
||||
Cancelar pedido
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</th:block>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
<th:block th:each="linea: ${lineas}">
|
||||
@ -76,7 +94,8 @@
|
||||
<script th:src="@{/assets/libs/datatables/buttons.colVis.min.js}"></script>
|
||||
|
||||
<script type="module" th:src="@{/assets/js/pages/imprimelibros/pedidos/pedidos-view.js}"></script>
|
||||
<script th:if="${isAdmin}" type="module" th:src="@{/assets/js/pages/imprimelibros/pedidos/pedidos-view-admin.js}"></script>
|
||||
<script th:if="${isAdmin}" type="module"
|
||||
th:src="@{/assets/js/pages/imprimelibros/pedidos/pedidos-view-admin.js}"></script>
|
||||
</th:block>
|
||||
</body>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user