fix: BUG-01 + AUTH + DATA-01 UnionFlow
BUG-01: BudgetService.toResponse() — remplace doubleValue()>0 par compareTo(BigDecimal.ZERO)>0 (précision BigDecimal) ; ajoute 2 tests couvrant varianceRate=0 (totalPlanned=0) et varianceRate=-40% AUTH: MembreKeycloakSyncService.changerMotDePassePremierLogin() — élargit le catch de ForbiddenException vers WebApplicationException avec vérification du statut HTTP (le REST client MicroProfile ne garantit pas la sous-classe) DATA-01: MembreService.desactiverMembre() — décrémente nombreMembres sur toutes les orgs actives du membre et passe le statutMembre à DESACTIVE
This commit is contained in:
@@ -322,7 +322,7 @@ public class BudgetService {
|
||||
// Champs calculés
|
||||
.realizationRate(budget.getRealizationRate())
|
||||
.variance(budget.getVariance())
|
||||
.varianceRate(budget.getTotalPlanned() != null && budget.getTotalPlanned().doubleValue() > 0
|
||||
.varianceRate(budget.getTotalPlanned().compareTo(BigDecimal.ZERO) > 0
|
||||
? budget.getVariance().doubleValue() / budget.getTotalPlanned().doubleValue() * 100
|
||||
: 0.0)
|
||||
.isOverBudget(budget.isOverBudget())
|
||||
|
||||
@@ -533,14 +533,20 @@ public class MembreKeycloakSyncService {
|
||||
.temporary(false)
|
||||
.build();
|
||||
|
||||
// Tentative via lions-user-manager ; fallback sur l'API Admin Keycloak directe si 403
|
||||
// Tentative via lions-user-manager ; fallback sur l'API Admin Keycloak directe si 403/503
|
||||
// Note : le REST client MicroProfile peut lever WebApplicationException (pas nécessairement
|
||||
// ForbiddenException) selon la configuration du mapper de réponse — on capture la classe mère.
|
||||
try {
|
||||
userServiceClient.resetPassword(keycloakUserId, DEFAULT_REALM, resetRequest);
|
||||
} catch (jakarta.ws.rs.ForbiddenException | jakarta.ws.rs.ServiceUnavailableException e) {
|
||||
LOGGER.warning("lions-user-manager reset-password échoué (" + e.getMessage()
|
||||
+ "), fallback sur API Admin Keycloak directe.");
|
||||
changerMotDePasseDirectKeycloak(membre.getId(), nouveauMotDePasse);
|
||||
return; // changerMotDePasseDirectKeycloak persiste déjà les flags
|
||||
} catch (jakarta.ws.rs.WebApplicationException e) {
|
||||
int status = e.getResponse() != null ? e.getResponse().getStatus() : 0;
|
||||
if (status == 403 || status == 503) {
|
||||
LOGGER.warning("lions-user-manager reset-password échoué (HTTP " + status
|
||||
+ "), fallback sur API Admin Keycloak directe.");
|
||||
changerMotDePasseDirectKeycloak(membre.getId(), nouveauMotDePasse);
|
||||
return; // changerMotDePasseDirectKeycloak persiste déjà les flags
|
||||
}
|
||||
throw e; // Statuts inattendus (400, 500…) : propager
|
||||
}
|
||||
|
||||
membre.setPremiereConnexion(false);
|
||||
|
||||
@@ -304,6 +304,16 @@ public class MembreService {
|
||||
}
|
||||
|
||||
membre.setActif(false);
|
||||
|
||||
// Décrémenter le compteur nombreMembres pour chaque organisation active du membre
|
||||
// (fix DATA-01 : le compteur restait figé lors d'une désactivation directe)
|
||||
membreOrganisationRepository.findOrganisationsActivesParMembre(id).forEach(mo -> {
|
||||
mo.getOrganisation().retirerMembre();
|
||||
mo.setStatutMembre("DESACTIVE");
|
||||
LOG.infof("Compteur membres décrémenté pour organisation %s (membre désactivé)",
|
||||
mo.getOrganisation().getId());
|
||||
});
|
||||
|
||||
LOG.infof("Membre désactivé: %s", membre.getNomComplet());
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user