tabla anonimos terminado

This commit is contained in:
2025-10-08 21:35:20 +02:00
parent 389ac22b68
commit 2b53579a48
8 changed files with 270 additions and 177 deletions

View File

@ -2,23 +2,13 @@ package com.imprimelibros.erp.presupuesto;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.Optional;
import java.util.TimeZone;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.Authentication;
import org.springframework.validation.BindingResult;
@ -28,13 +18,13 @@ import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.http.MediaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.core.type.TypeReference;
import com.imprimelibros.erp.datatables.*;
import com.imprimelibros.erp.externalApi.skApiClient;
import com.imprimelibros.erp.i18n.TranslationService;
@ -42,7 +32,6 @@ 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.PresupuestoDTAnonimo;
import com.imprimelibros.erp.presupuesto.validation.PresupuestoValidationGroups;
import jakarta.servlet.http.HttpServletRequest;
@ -63,13 +52,13 @@ public class PresupuestoController {
private final ObjectMapper objectMapper;
private final TranslationService translationService;
private final PresupuestoRepository repo;
private final PresupuestoDatatableService dtService;
public PresupuestoController(ObjectMapper objectMapper, TranslationService translationService,
PresupuestoRepository repo) {
PresupuestoDatatableService dtService) {
this.objectMapper = objectMapper;
this.translationService = translationService;
this.repo = repo;
this.dtService = dtService;
}
@PostMapping("/public/validar/datos-generales")
@ -444,85 +433,11 @@ public class PresupuestoController {
@GetMapping(value = "/datatable/anonimos", produces = "application/json")
@ResponseBody
public DataTablesResponse<Map<String, Object>> datatable(
HttpServletRequest request,
Authentication authentication,
Locale locale) {
public DataTablesResponse<Map<String,Object>> datatableAnonimos(
HttpServletRequest request, Authentication auth, Locale locale) {
DataTablesRequest dt = DataTablesParser.from(request);
// Filtros (opcional): p.ej. estado desde select extra
String fEstado = Optional.ofNullable(dt.raw.get("f_estado")).orElse(""); // '', 'borrador', ...
String term = (dt.search != null && dt.search.value != null) ? dt.search.value.trim() : "";
// Pageable y Sort desde DataTables (usarás 'name' completos en el front)
int page = dt.length > 0 ? dt.start / dt.length : 0;
List<Sort.Order> orders = new ArrayList<>();
for (var o : dt.order) {
String field = dt.columns.get(o.column).name; // EJ: "cliente.nombre", "tipoImpresion", "pais"
// Whitelist de campos ordenables:
switch (field) {
case "id", "titulo",
"tipoEncuadernacion", "tipoCubierta", "tipoImpresion",
"selectedTirada", "paginas", "estado",
"totalConIva",
"pais", "region", "ciudad",
"updatedAt" ->
orders.add(new Sort.Order(
"desc".equalsIgnoreCase(o.dir) ? Sort.Direction.DESC : Sort.Direction.ASC,
field));
default -> {
/* ignora */ }
}
}
Sort sort = orders.isEmpty() ? Sort.by(Sort.Order.asc("id")) : Sort.by(orders);
Pageable pageable = dt.length > 0 ? PageRequest.of(page, dt.length, sort) : Pageable.unpaged();
// Query DTO
Page<PresupuestoDTAnonimo> pageDTO = repo.datatableAnonimos(fEstado, term, pageable);
long total = repo.count();
// para formatear la fecha
ZoneId zone = null;
if (locale != null && locale.getCountry() != null && !locale.getCountry().isEmpty()) {
zone = TimeZone.getTimeZone(locale.toLanguageTag()).toZoneId();
} else {
zone = ZoneId.systemDefault(); // fallback
}
DateTimeFormatter df = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm").withZone(zone);
// Mapear DTO -> Map para DataTables + acciones
List<Map<String, Object>> rows = pageDTO.getContent().stream().map(r -> {
Map<String, Object> m = new HashMap<>();
m.put("id", r.id());
m.put("titulo", r.titulo());
m.put("tipoEncuadernacion", r.tipoEncuadernacion().name()); // o etiqueta i18n si quieres
m.put("tipoCubierta", r.tipoCubierta().name());
m.put("tipoImpresion", r.tipoImpresion().name());
m.put("tirada", r.selectedTirada());
m.put("paginas", r.paginas());
m.put("estado", r.estado().name());
m.put("totalConIva", r.totalConIva());
m.put("pais", r.pais());
m.put("region", r.region());
m.put("ciudad", r.ciudad());
m.put("updatedAt", r.updatedAt() == null ? "" : df.format(r.updatedAt()));
// Mantén aquí tu “actions” como antes (puedes usar `tipo` en el css)
m.put("actions",
"<div class=\"hstack gap-3 flex-wrap\">" +
" <a href=\"javascript:void(0);\" data-id=\"" + r.id()
+ "\" class=\"link-success btn-edit-anonimo"
+ " fs-15\"><i class=\"ri-edit-2-line\"></i></a>" +
" <a href=\"javascript:void(0);\" data-id=\"" + r.id()
+ "\" class=\"link-danger btn-delete-anonimo"
+ " fs-15\"><i class=\"ri-delete-bin-5-line\"></i></a>" +
"</div>");
return m;
}).toList();
return new DataTablesResponse<>(dt.draw, total, pageDTO.getTotalElements(), rows);
return dtService.datatableAnonimos(dt, locale);
}
}