modificando carrito

This commit is contained in:
2025-10-27 20:30:11 +01:00
parent de7a392e07
commit f6a683de81
22 changed files with 1050 additions and 42 deletions

View File

@ -1,5 +1,6 @@
package com.imprimelibros.erp.direcciones;
import java.security.Principal;
import java.time.Instant;
import java.util.ArrayList;
import java.util.List;
@ -43,20 +44,23 @@ import jakarta.validation.Valid;
@RequestMapping("/direcciones")
public class DireccionController {
private final DireccionService direccionService;
protected final DireccionRepository repo;
protected final PaisesService paisesService;
protected final MessageSource messageSource;
protected final UserDao userRepo;
protected final TranslationService translationService;
public DireccionController(DireccionRepository repo, PaisesService paisesService,
MessageSource messageSource, UserDao userRepo, TranslationService translationService) {
MessageSource messageSource, UserDao userRepo, TranslationService translationService,
DireccionService direccionService) {
this.repo = repo;
this.paisesService = paisesService;
this.messageSource = messageSource;
this.userRepo = userRepo;
this.translationService = translationService;
this.direccionService = direccionService;
}
@GetMapping()
@ -295,6 +299,33 @@ public class DireccionController {
return "imprimelibros/direcciones/direccion-form :: direccionForm";
}
@GetMapping("direction-form")
public String getForm(@RequestParam(required = false) Long id,
Direccion direccion,
BindingResult binding,
Model model,
HttpServletResponse response,
Principal principal,
Locale locale) {
model.addAttribute("paises", paisesService.getForSelect("", "", locale).get("results"));
Direccion newDireccion = new Direccion();
User user = null;
if (principal instanceof UserDetailsImpl udi) {
user = new User();
user.setId(udi.getId());
} else if (principal instanceof User u && u.getId() != null) {
user = u;
}
newDireccion.setUser(user);
model.addAttribute("dirForm", newDireccion);
model.addAttribute("action", "/direcciones/add");
return "imprimelibros/direcciones/direccion-form-fixed-user :: direccionForm";
}
@PostMapping
public String create(
@Valid @ModelAttribute("dirForm") Direccion direccion,
@ -327,6 +358,34 @@ public class DireccionController {
return null;
}
// para el formulario modal en checkout
@PostMapping("/add")
public String create2(
@Valid @ModelAttribute("dirForm") Direccion direccion,
BindingResult binding,
Model model,
HttpServletResponse response,
Authentication auth,
Locale locale) {
User current = userRepo.findByUserNameIgnoreCaseAndEnabledTrueAndDeletedFalse(auth.getName()).orElse(null);
direccion.setUser(current);
if (binding.hasErrors()) {
response.setStatus(422);
model.addAttribute("paises", paisesService.getForSelect("", "", locale).get("results"));
model.addAttribute("action", "/direcciones/add");
model.addAttribute("dirForm", direccion);
return "imprimelibros/direcciones/direccion-form-fixed-user :: direccionForm";
}
var data = direccion;
repo.save(data);
response.setStatus(201);
return null;
}
@PostMapping("/{id}")
public String update(
@PathVariable Long id,
@ -416,12 +475,33 @@ public class DireccionController {
}
}
@GetMapping(value = "/select2", produces = "application/json")
@ResponseBody
public Map<String, Object> getSelect2(
@RequestParam(value = "q", required = false) String q1,
@RequestParam(value = "term", required = false) String q2,
Authentication auth) {
boolean isAdmin = auth.getAuthorities().stream()
.anyMatch(a -> a.getAuthority().equals("ROLE_ADMIN") || a.getAuthority().equals("ROLE_SUPERADMIN"));
Long currentUserId = null;
if (auth != null && auth.getPrincipal() instanceof UserDetailsImpl udi) {
currentUserId = udi.getId();
} else if (auth != null) {
currentUserId = userRepo.findIdByUserNameIgnoreCase(auth.getName()).orElse(null);
}
return direccionService.getForSelect(q1, q2, isAdmin ? null : currentUserId);
}
private boolean isOwnerOrAdmin(Authentication auth, Long ownerId) {
if (auth == null) {
return false;
}
boolean isAdmin = auth.getAuthorities().stream()
.anyMatch(a -> a.getAuthority().equals("ROLE_ADMIN"));
.anyMatch(a -> a.getAuthority().equals("ROLE_ADMIN") || a.getAuthority().equals("ROLE_SUPERADMIN"));
if (isAdmin) {
return true;
}
@ -434,4 +514,5 @@ public class DireccionController {
}
return currentUserId != null && currentUserId.equals(ownerId);
}
}

View File

@ -0,0 +1,86 @@
package com.imprimelibros.erp.direcciones;
import java.text.Collator;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
import org.springframework.stereotype.Service;
import com.imprimelibros.erp.direcciones.DireccionRepository;
import com.imprimelibros.erp.paises.Paises;
@Service
public class DireccionService {
protected DireccionRepository repo;
public DireccionService(DireccionRepository repo) {
this.repo = repo;
}
public Map<String, Object> getForSelect(String q1, String q2, Long userId) {
try {
// Termino de búsqueda (Select2 usa 'q' o 'term' según versión/config)
String search = Optional.ofNullable(q1).orElse(q2);
if (search != null) {
search = search.trim();
}
final String q = (search == null || search.isEmpty())
? null
: search.toLowerCase();
List<Direccion> all = userId != null ? repo.findByUserId(userId) : repo.findAll();
// Mapear a opciones id/text con i18n y filtrar por búsqueda si llega
List<Map<String, String>> options = all.stream()
.map(cc -> {
String id = cc.getId().toString();
String alias = cc.getAlias();
String direccion = cc.getDireccion();
String cp = String.valueOf(cc.getCp());
String ciudad = cc.getCiudad();
String att = cc.getAtt();
Map<String, String> m = new HashMap<>();
m.put("id", id); // lo normal en Select2: id = valor que guardarás (code3)
m.put("text", alias); // texto mostrado, i18n con fallback a keyword
m.put("cp", cp);
m.put("ciudad", ciudad);
m.put("att", att);
m.put("alias", alias);
m.put("direccion", direccion);
return m;
})
.filter(opt -> {
if (q == null || q.isEmpty())
return true;
String cp = opt.get("cp");
String ciudad = opt.get("ciudad").toLowerCase();
String att = opt.get("att").toLowerCase();
String alias = opt.get("alias").toLowerCase();
String text = opt.get("text").toLowerCase();
String direccion = opt.get("direccion").toLowerCase();
return text.contains(q) || cp.contains(q) || ciudad.contains(q) || att.contains(q) || alias.contains(q) || direccion.contains(q);
})
.sorted(Comparator.comparing(m -> m.get("text"), Collator.getInstance()))
.collect(Collectors.toList());
// Estructura Select2
Map<String, Object> resp = new HashMap<>();
resp.put("results", options);
return resp;
} catch (Exception e) {
e.printStackTrace();
return Map.of("results", List.of());
}
}
public Optional<Direccion> findById(Long id) {
return repo.findById(id);
}
}