diff --git a/api-remocra/api/src/main/java/fr/sdis83/remocra/repository/OrganismesRepository.java b/api-remocra/api/src/main/java/fr/sdis83/remocra/repository/OrganismesRepository.java index 53f0e5902..ccca02d97 100644 --- a/api-remocra/api/src/main/java/fr/sdis83/remocra/repository/OrganismesRepository.java +++ b/api-remocra/api/src/main/java/fr/sdis83/remocra/repository/OrganismesRepository.java @@ -3,6 +3,8 @@ import static fr.sdis83.remocra.db.model.remocra.Tables.ORGANISME; import static fr.sdis83.remocra.db.model.remocra.Tables.TRANSFERTS_AUTOMATISES; import static fr.sdis83.remocra.db.model.remocra.Tables.TYPE_ORGANISME; +import static org.jooq.impl.DSL.name; +import static org.jooq.impl.SQLDataType.BIGINT; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; @@ -13,6 +15,7 @@ import java.util.ArrayList; import java.util.List; import javax.inject.Inject; +import org.jooq.CommonTableExpression; import org.jooq.Condition; import org.jooq.DSLContext; import org.jooq.impl.DSL; @@ -101,4 +104,24 @@ public OrganismeModel readByEmail(String email) { } return o; } + + public List getOrganismeAvecEnfants(Long idOrganisme) { + CommonTableExpression cte = + name("org") + .fields("id") + .as( + context + .selectDistinct(ORGANISME.ID) + .from(ORGANISME) + .where(ORGANISME.ID.eq(idOrganisme)) + .unionAll( + context + .select(ORGANISME.ID) + .from((DSL.table("org")).crossJoin(ORGANISME)) + .where( + ORGANISME.ORGANISME_PARENT.eq( + DSL.field(name("org", "id"), BIGINT))))); + + return context.withRecursive(cte).selectFrom(cte).fetchInto(Long.class); + } } diff --git a/api-remocra/api/src/main/java/fr/sdis83/remocra/repository/TourneeRepository.java b/api-remocra/api/src/main/java/fr/sdis83/remocra/repository/TourneeRepository.java index 75eddfb59..12230e027 100644 --- a/api-remocra/api/src/main/java/fr/sdis83/remocra/repository/TourneeRepository.java +++ b/api-remocra/api/src/main/java/fr/sdis83/remocra/repository/TourneeRepository.java @@ -31,15 +31,15 @@ public TourneeRepository(DSLContext context, TransactionManager transactionManag * l'utilisateur et donc de son organisme * de si un autre utilisateur est en train de la faire ou * non * - * @param idOrganisme : id de l'organisme de l'utilisateur + * @param idsOrganisme : liste des ids de l'organisme de l'utilisateur et ces organismes enfants * @return la liste des tournées disponibles */ - public List getTourneesDisponibles(Long idOrganisme) { + public List getTourneesDisponibles(List idsOrganisme) { return context .select(TOURNEE.ID, TOURNEE.NOM, TOURNEE.AFFECTATION, TOURNEE.RESERVATION) .from(TOURNEE) .where(TOURNEE.RESERVATION.isNull()) - .and(TOURNEE.AFFECTATION.eq(idOrganisme)) + .and(TOURNEE.AFFECTATION.in(idsOrganisme)) .and(TOURNEE.ETAT.lessThan(100)) .fetch( (RecordMapper) diff --git a/api-remocra/api/src/main/java/fr/sdis83/remocra/usecase/tournee/TourneeUseCase.java b/api-remocra/api/src/main/java/fr/sdis83/remocra/usecase/tournee/TourneeUseCase.java index 6aea2f795..235053777 100644 --- a/api-remocra/api/src/main/java/fr/sdis83/remocra/usecase/tournee/TourneeUseCase.java +++ b/api-remocra/api/src/main/java/fr/sdis83/remocra/usecase/tournee/TourneeUseCase.java @@ -1,6 +1,7 @@ package fr.sdis83.remocra.usecase.tournee; import com.google.inject.Inject; +import fr.sdis83.remocra.repository.OrganismesRepository; import fr.sdis83.remocra.repository.TourneeRepository; import fr.sdis83.remocra.web.model.mobilemodel.ImmutableTourneeModel; import fr.sdis83.remocra.web.model.mobilemodel.TourneeModel; @@ -12,14 +13,16 @@ public class TourneeUseCase { @Inject TourneeRepository tourneeRepository; + @Inject OrganismesRepository organismesRepository; @Inject public TourneeUseCase(TourneeRepository tourneeRepository) { this.tourneeRepository = tourneeRepository; } - public List getTourneesDisponibles(Long idOrganisme) { - return tourneeRepository.getTourneesDisponibles(idOrganisme); + public List getTourneesDisponibles(Long idOrganismeUtilisateur) { + List idsOrganisme = organismesRepository.getOrganismeAvecEnfants(idOrganismeUtilisateur); + return tourneeRepository.getTourneesDisponibles(idsOrganisme); } public ReservationTourneesResponse reserveTournees(List listIdTournees, Long idUser) {