Etablissement etablissement
Boolean estFusionne = Boolean.FALSE // par défaut
Boolean estMasque = Boolean.FALSE // par défaut
+
Boolean isMigre = null
private Autorite proprietaire
responsableStructureEnseignement: param.responsableStructureEnseignement,
porteurEnt: param.porteurEnt
)
- ps.save(failOnError: true)
+ ps.save(failOnError: true, flush: true)
return ps
}
import org.lilie.services.eliot.OperationMaintenance
import org.hibernate.SessionFactory
import org.codehaus.groovy.grails.plugins.DomainClassGrailsPlugin
+import org.hibernate.Session
+import org.hibernate.SQLQuery
abstract class AbstractMigraionPartgasService {
AnnuaireService annuaireService
DistantAutoriteService distantAutoriteService
- def dataSource
+
+ def grailsApplication
SessionFactory sessionFactory
- protected Boolean dejaExecute(String codeOperation) {
+ protected Boolean isTermine(String codeOperation) {
OperationMaintenance.createCriteria().count {
eq('code', codeOperation)
eq('etat', OperationMaintenance.ETAT_TERMINE)
} as Boolean
}
+ protected Boolean isCommence(String codeOperation) {
+ OperationMaintenance.createCriteria().count {
+ eq('code', codeOperation)
+ eq('etat', OperationMaintenance.ETAT_DEBUT)
+ } as Boolean
+ }
protected void marqueDebutOperation(String codeOperation) {
- OperationMaintenance operation = new OperationMaintenance(
- code: codeOperation,
- etat: OperationMaintenance.ETAT_DEBUT,
- date: new Date()
- )
+ OperationMaintenance operation =
+ OperationMaintenance.createCriteria().get {
+ eq('code', codeOperation)
+ eq('etat', OperationMaintenance.ETAT_DEBUT)
+ } ?:
+ new OperationMaintenance(
+ code: codeOperation,
+ etat: OperationMaintenance.ETAT_DEBUT,
+ )
+
+ operation.date = new Date()
operation.save(flush: true, failOnError: true)
}
}
- protected void migrePermissionsExistantesSurGroupesLocaux(SecuriteSession securiteSession,
- Item item) {
-
+ protected void migrePermissionsAutoSurGroupesLocaux(SecuriteSession securiteSession,
+ Item item) {
List<Autorisation> autorisationModifiees = findAllAutorisationModifieDesGroupesDistants(item)
}
}
- List<Autorisation> findAllAutorisationModifieDesGroupesDistants(Item item) {
- String hqlQuery = """
+
+ private static final String FIND_AUTORISATIONS_MODIFIES_GROUPES_DISTANTS_HQL =
+ """
SELECT autorisation
FROM Autorisation AS autorisation
INNER JOIN FETCH autorisation.autorite as autorite
-
- WHERE autorisation.item =:item
+ WHERE autorisation.item.id =:itemId
AND autorite.type = :groupe
AND autorite.localisation = :localisation
AND autorisation.valeurPermissionsExpliciteDefaut != 0
AND autorisation.valeurPermissionsExpliciteDefaut !=
autorisation.valeurPermissionsExplicite
- """
+ """
+ protected List<Autorisation> findAllAutorisationModifieDesGroupesDistants(Item item) {
return Autorisation.executeQuery(
- hqlQuery,
+ FIND_AUTORISATIONS_MODIFIES_GROUPES_DISTANTS_HQL,
[
- item: item,
+ itemId: item.id,
groupe: Autorite.TYPE_GROUPE,
localisation: Autorite.LOCALISATION_DISTANTE
]
)
}
- Autorisation findAutorisationAvecDroitsParDefautDeGroupeLocalByFonction(Item item, FonctionEnum fonction) {
-
- String hql = """
- SELECT autorisation
- From Autorisation as autorisation,
- ProprietesScolarite as groupe
- WHERE groupe.autorite = autorisation.autorite
- AND autorisation.item = :item
- AND autorisation.valeurPermissionsExpliciteDefaut != 0
- AND groupe.fonction.code = :fonction
- AND (
- groupe.responsableStructureEnseignement is null
- OR
- groupe.responsableStructureEnseignement = false
- )
+
+ private static final String FIND_AUTORISATIONS_PAR_DEFAUT_GROUPES_LOCAUX_HQL =
"""
+ SELECT autorisation
+ From Autorisation as autorisation,
+ ProprietesScolarite as groupe
+ WHERE groupe.autorite = autorisation.autorite
+ AND autorisation.item.id = :itemId
+ AND autorisation.valeurPermissionsExpliciteDefaut != 0
+ AND groupe.fonction.code = :fonction
+ AND (
+ groupe.responsableStructureEnseignement is null
+ OR
+ groupe.responsableStructureEnseignement = false
+ )
+ """
+
+ Autorisation findAutorisationAvecDroitsParDefautDeGroupeLocalByFonction(Item item,
+ FonctionEnum fonction) {
return Autorisation.executeQuery(
- hql,
+ FIND_AUTORISATIONS_PAR_DEFAUT_GROUPES_LOCAUX_HQL,
[
- item: item,
+ itemId: item.id,
fonction: fonction.code.toString()
]
)[0]
getEliotTextesSecuriteSessionForCodePorteurENT(etablissement.porteurEnt.code)
}
- protected String getSqlParametresListLong(List liste) {
- String param = ""
- liste.each {
- param += it + ','
+ private static final String FIND_ID_EXTERNES_GROUPES_DISTANTES_HQL = """
+ select distinct autorite.idExterne
+ from Autorisation autoritsation
+ inner join autoritsation.autorite autorite
+ where autoritsation.item = :item
+ and autorite.localisation = '${Autorite.LOCALISATION_DISTANTE}'
+ and autorite.type = '${Autorite.TYPE_GROUPE}'
+ """
+
+ /**
+ * Récupère tous les idExternes des groupes distants auxquels l'item est partagé.
+ */
+ protected List<String> findAllIdExterneGroupeDistant(Item item) {
+ return Autorisation.executeQuery(FIND_ID_EXTERNES_GROUPES_DISTANTES_HQL, [item: item])
+ }
+
+
+ public static final String DELETE_AUTORISATIONS_PAR_DEFAUT_GROUPES_DISTANTS_SQL = """
+ DELETE FROM securite.autorisation AS autorisationToDelete
+ WHERE EXISTS (
+ SELECT * FROM securite.autorisation AS autorisation
+ INNER JOIN securite.autorite AS autorite ON autorisation.autorite_id = autorite.id
+ WHERE autorisationToDelete.id = autorisation.id
+ AND autorite.type = 'groupe'
+ AND autorite.localisation = 'DISTANTE'
+ AND autorisation.valeur_permissions_explicite_defaut != 0
+ AND autorisation.item_id IN (:itemIds)
+ )
+ """
+
+ protected void supprimeAllAutorisationParDefautGroupesDistants(List<Item> items) {
+ if (items.size() == 0) {
+ return
}
- param.substring(0, param.size() - 1)
+ Session session = sessionFactory.getCurrentSession()
+ SQLQuery sqlQuery = session.createSQLQuery(DELETE_AUTORISATIONS_PAR_DEFAUT_GROUPES_DISTANTS_SQL)
+ sqlQuery.setParameterList('itemIds', items*.id)
+
+ sqlQuery.executeUpdate()
}
+
+ public static final String DELETE_AUTORISATIONS_GROUPES_DISTANTS_SQL = """
+ DELETE FROM securite.autorisation AS autorisationToDelete
+ WHERE EXISTS (
+ SELECT * FROM securite.autorisation AS autorisation
+ INNER JOIN securite.autorite AS autorite ON autorisation.autorite_id = autorite.id
+ WHERE autorisationToDelete.id = autorisation.id
+ AND autorite.type = 'groupe'
+ AND autorite.localisation = 'DISTANTE'
+ AND autorisation.item_id IN (:itemIds)
+ )
+ """
+
+ protected void supprimeAllAutorisationGroupesDistants(List<Item> items) {
+ if (items.size() == 0) {
+ return
+ }
+
+ Session session = sessionFactory.getCurrentSession()
+ SQLQuery sqlQuery = session.createSQLQuery(DELETE_AUTORISATIONS_GROUPES_DISTANTS_SQL)
+ sqlQuery.setParameterList('itemIds', items*.id)
+
+ sqlQuery.executeUpdate()
+ }
}
void enregistreGroupesEnDroit(Item item,
Etablissement etablissement,
- GroupesEnDroit groupesEnDroit
- ) {
+ GroupesEnDroit groupesEnDroit) {
if (groupesEnDroit.consultation.size() > 0) {
ajouteDefaultDroitConsultation(
void ajouteDefaultDroitConsultation(Item item,
Etablissement etablissement,
- List<Autorite> autorites
- ) {
+ List<Autorite> autorites) {
autorites.each {Autorite autorite ->
PermissionsManager permission = creePermission(
}
test {
}
+
+ // Pour déclencher la migration de différents types d'agenda
+ eliot.agenda.migration.partages.auto = false
}
import org.lilie.services.eliot.temps.Agenda
import org.lilie.services.eliot.annuaire.SecuriteSession
import org.codehaus.groovy.grails.commons.ConfigurationHolder
-import groovy.sql.Sql
+import org.hibernate.Session
+import org.hibernate.SQLQuery
+import org.lilie.services.eliot.GormUtils
+import org.hibernate.FlushMode
class AgendaMigrationPartagesService extends AbstractMigraionPartgasService {
static transactional = false
- private static final CODE_OPERATION = 'AGENDA_MIGRATION_PARTAGES_AUTO'
+ private static final MIGRATION_PARTAGES_AUTO = 'AGENDA_MIGRATION_PARTAGES_AUTO'
AgendaPartageAutoService agendaPartageAutoService
- public static final String GET_ALL_AGENDA_A_TRAITER = """
- SELECT agenda FROM
- Agenda as agenda
- WHERE agenda.isMigre = false
-"""
-
-
void execute() {
// La migration se fait uniquement en mode maintenance
if (ConfigurationHolder.config.eliot.mode.maintenance != true) {
return
}
- if (dejaExecute(CODE_OPERATION)) {
+ migrePartagesAuto()
+ }
+
+
+ private void migrePartagesAuto() {
+ String operation = MIGRATION_PARTAGES_AUTO
+
+ if (grailsApplication.config.eliot.agenda.migration.partages.auto != true) {
+ if (log.infoEnabled) {
+ log.info("L'opération $operation n'est pas activée (eliot.agenda.migration.partages.auto)")
+ }
return
}
- if (log.infoEnabled) {
- log.info('Début de la migration des agendas')
+ if (isTermine(operation)) {
+ if (log.infoEnabled) {
+ log.info("L'oprération $operation avait déjà été effectuée")
+ }
+ return
}
- marqueDebutOperation(CODE_OPERATION)
+ if (log.infoEnabled) {log.info("Début opération: " + operation)}
- for (
- List<Agenda> agendas = findLotAgendaATraiter();
- !agendas.isEmpty();
- agendas = findLotAgendaATraiter()
- ) {
+ GormUtils.withFlushModeAndSession(FlushMode.MANUAL) {Session session ->
- Agenda.withTransaction {
- agendas.each {Agenda agenda ->
- migrePermissionsExistantesSurGroupesLocaux(agenda)
- }
+ if (!isCommence(operation)) {
+ marqueAgendaAMigrer()
+ }
- if (log.debugEnabled) {
- log.debug("Suppression des autorisations des groupes distants. Nbr : ${agendas.size()}")
- }
+ marqueDebutOperation(operation)
+
+ for (
+ List<Agenda> agendas = findLotAgendaATraiter();
+ !agendas.isEmpty();
+ agendas = findLotAgendaATraiter()
+ ) {
+
+ Agenda.withTransaction {
+ agendas.each {Agenda agenda ->
+ migrePermissionsExistantesSurGroupesLocaux(agenda)
+ }
+
+ session.flush()
- supprimeAllAutorisationParDefautGroupesDistants(agendas*.id)
- if (log.debugEnabled) {
- log.debug("Fin")
+ if (log.debugEnabled) {
+ log.debug("Suppression des autorisations des groupes distants. Nbr : ${agendas.size()}")
+ }
+
+ supprimeAllAutorisationParDefautGroupesDistants(agendas*.item)
+ clear()
}
- clear()
}
- }
- if (log.infoEnabled) {
- log.info('Fin de la migration des agendas')
+ marqueFinOperation(MIGRATION_PARTAGES_AUTO)
}
- marqueFinOperation(CODE_OPERATION)
+
+ if (log.infoEnabled) {log.info('Fin opération: ' + operation)}
}
+
+ private void marqueAgendaAMigrer() {
+
+ String query = """
+ UPDATE enttemps.agenda AS agenda
+ SET is_migre =
+ CASE
+ WHEN EXISTS (
+ SELECT * FROM enttemps.agenda AS ag
+ INNER JOIN enttemps.type_agenda as type
+ ON ag.type_agenda_id = type.id
+ WHERE ag.id = agenda.id
+ AND type.code in ('ETS', 'ETE', 'CSE')
+ )
+ THEN false
+ ELSE NULL
+ END
+ """
+
+ Session session = sessionFactory.getCurrentSession()
+ SQLQuery sqlQuery = session.createSQLQuery(query)
+
+ sqlQuery.executeUpdate()
+ }
+
+
+ public static final String GET_ALL_AGENDA_A_TRAITER = """
+ SELECT agenda FROM
+ Agenda as agenda
+ INNER JOIN FETCH agenda.item
+ WHERE agenda.isMigre = false
+ """
+
private List<Agenda> findLotAgendaATraiter() {
return Agenda.executeQuery(
)
}
+
private void migrePermissionsExistantesSurGroupesLocaux(Agenda agenda) {
if (log.infoEnabled) {
- log.info "Migration des partages pour l'agenda ${agenda.nom}"
+ log.info "Migration des partages pour l'agenda Agenda{id = ${agenda.id}, nom = ${agenda.nom}}"
}
SecuriteSession securiteSession = getSecuriteSessionSystem(
agendaPartageAutoService.partageAgenda(agenda)
- migrePermissionsExistantesSurGroupesLocaux(securiteSession, agenda.item)
+ migrePermissionsAutoSurGroupesLocaux(securiteSession, agenda.item)
agenda.droitsIncomplets = false
agenda.isMigre = true
}
-
- private void supprimeAllAutorisationParDefautGroupesDistants(List agendaIds) {
- if (agendaIds.size() == 0) {
- return
- }
-
-
- Sql sql = new Sql(dataSource)
-
- String query = """
- DELETE FROM securite.autorisation WHERE id IN (
- SELECT autorisation.id FROM securite.autorisation AS autorisation
- INNER JOIN securite.autorite AS autorite ON autorisation.autorite_id = autorite.id
- INNER JOIN securite.item AS item ON autorisation.item_id = item.id
- INNER JOIN enttemps.agenda AS agenda ON agenda.item_id = item.id
-
- WHERE autorite.type = 'groupe'
- AND autorite.localisation = 'DISTANTE'
- AND autorisation.valeur_permissions_explicite_defaut !=0
- AND agenda.id IN (${getSqlParametresListLong(agendaIds)})
- )
- """
-
- sql.executeUpdate(query)
- }
}
import org.lilie.services.eliot.annuaire.SecuriteSession
import org.lilie.services.eliot.securite.permission.partageauto.CahierDeTextesPartageAutoService
import org.lilie.services.eliot.securite.permission.AbstractMigraionPartgasService
-import org.codehaus.groovy.grails.commons.ConfigurationHolder
-import groovy.sql.Sql
+
+import org.hibernate.Session
+import org.hibernate.SQLQuery
+import org.lilie.services.eliot.GormUtils
+import org.hibernate.FlushMode
+import org.lilie.services.eliot.annuaire.GroupeInfo
+import org.lilie.services.eliot.scolarite.Etablissement
+import org.lilie.services.eliot.scolarite.annuaire.LocalGroupeService
+import org.lilie.services.eliot.securite.impl.Autorite
+import org.lilie.services.eliot.securite.PermissionsManager
+import org.lilie.services.eliot.securite.impl.DefaultPermissionsManager
class TextesMigrationPartagesService extends AbstractMigraionPartgasService {
static transactional = false
- private static final CODE_OPERATION = 'TEXTES_MIGRATION_PARTAGES_AUTO'
+ private static final MIGRATION_PARTAGES_AUTO = 'TEXTES_MIGRATION_PARTAGES_AUTO'
+ private static final MIGRATION_PARTAGES_ARCHIVE = 'TEXTES_MIGRATION_PARTAGES_ARCHIVE'
+ private static final MIGRATION_PARTAGES_MANUEL = 'TEXTES_MIGRATION_PARTAGES_MANUEL'
CahierDeTextesPartageAutoService cahierDeTextesPartageAutoService
-
- public static final String GET_CDT_A_TRAITER = """
- SELECT cahier FROM
- CahierDeTextes as cahier
- WHERE cahier.isMigre = false
-"""
-
+ LocalGroupeService localGroupeService
void execute() {
// La migration se fait uniquement en mode maintenance
- if (ConfigurationHolder.config.eliot.mode.maintenance != true) {
+ if (grailsApplication.config.eliot.mode.maintenance != true) {
return
}
- if (dejaExecute(CODE_OPERATION)) {
+ migrePartagesAuto()
+ migrePartagesArchive()
+ migrePartagesManuel()
+ }
+
+
+ private void migrePartagesAuto() {
+
+ String operation = MIGRATION_PARTAGES_AUTO
+
+ if (grailsApplication.config.eliot.textes.migration.partages.auto != true) {
+ if (log.infoEnabled) {
+ log.info("L'opération $operation n'est pas activée (eliot.textes.migration.partages.auto)")
+ }
return
}
- if (log.infoEnabled) {log.info('Début de la migration des cahiers de textes')}
- marqueDebutOperation(CODE_OPERATION)
+ if (isTermine(operation)) {
+ if (log.infoEnabled) {
+ log.info("L'oprération $operation avait déjà été effectuée")
+ }
+ return
+ }
- for (
- List<CahierDeTextes> cdts = findLotCahierDeTextesATraiter();
- !cdts.isEmpty();
- cdts = findLotCahierDeTextesATraiter()
- ) {
+ if (log.infoEnabled) {log.info("Début opération: " + operation)}
- CahierDeTextes.withTransaction {
- cdts.each { CahierDeTextes cdt ->
- migrePermissionsExistantesSurGroupesLocaux(cdt)
- }
+ GormUtils.withFlushModeAndSession(FlushMode.MANUAL) {Session session ->
- if (log.infoEnabled) {log.info("Suppression des autorisations des groupes distants. Nbr : ${cdts.size()}")}
- supprimeAllAutorisationParDefautGroupesDistants(cdts*.id)
- if (log.infoEnabled) {log.info("Fin")}
- clear()
+ if (!isCommence(operation)) {
+ marqueCahiersServiceAMigrer()
}
+
+ marqueDebutOperation(operation)
+
+ for (
+ List<CahierDeTextes> cdts = findLotCahierDeTextesATraiter();
+ !cdts.isEmpty();
+ cdts = findLotCahierDeTextesATraiter()
+ ) {
+
+ CahierDeTextes.withTransaction {
+ cdts.each { CahierDeTextes cdt ->
+ migrePermissionsAutoSurGroupesLocaux(cdt)
+ }
+
+ session.flush()
+
+ if (log.infoEnabled) {
+ log.info("Suppression des autorisations auto des groupes distants pour les cahiers services. Nbr : ${cdts.size()}")
+ }
+ supprimeAllAutorisationParDefautGroupesDistants(cdts*.item)
+ clear()
+ }
+ }
+
+ marqueFinOperation(operation)
}
- if (log.infoEnabled) {log.info('Fin de la migration des cahiers de textes')}
- marqueFinOperation(CODE_OPERATION)
+ if (log.infoEnabled) {log.info('Fin opération: ' + operation)}
}
- private List<CahierDeTextes> findLotCahierDeTextesATraiter() {
+ private void marqueCahiersServiceAMigrer() {
- return CahierDeTextes.executeQuery(
- GET_CDT_A_TRAITER,
- [:],
- [max: 20, offset: 0]
- )
+ String query = """
+ UPDATE entcdt.cahier_de_textes AS cahier
+ SET is_migre =
+ CASE
+ WHEN EXISTS (
+ SELECT * FROM entcdt.cahier_de_textes AS cdt
+ INNER JOIN ent.annee_scolaire AS annee
+ ON cdt.annee_scolaire_id = annee.id
+ WHERE cdt.id = cahier.id
+ AND cdt.service_id IS NOT NULL
+ AND annee.annee_en_cours = true
+ )
+ THEN false
+ ELSE NULL
+ END
+ """
+
+ Session session = sessionFactory.getCurrentSession()
+ SQLQuery sqlQuery = session.createSQLQuery(query)
+
+ sqlQuery.executeUpdate()
}
- private void migrePermissionsExistantesSurGroupesLocaux(CahierDeTextes cdt) {
- if (log.infoEnabled) {log.info "Migration des partages pour le cahier de textes ${cdt.nom}"}
+ private void migrePermissionsAutoSurGroupesLocaux(CahierDeTextes cdt) {
+ if (log.infoEnabled) {
+ log.info("Migration des partages auto pour le cahier service CahierDeTextes{id = ${cdt.id}, nom = ${cdt.nom}}")
+ }
SecuriteSession securiteSession = getSecuriteSessionSystem(
cdt.service.structureEnseignement.etablissement
cahierDeTextesPartageAutoService.partageCahierService(cdt)
- migrePermissionsExistantesSurGroupesLocaux(securiteSession, cdt.item)
+ migrePermissionsAutoSurGroupesLocaux(securiteSession, cdt.item)
cdt.droitsIncomplets = false
cdt.isMigre = true
}
- private void supprimeAllAutorisationParDefautGroupesDistants(List cdtIds) {
- if (cdtIds.size() == 0) {
+ private void migrePartagesArchive() {
+ String operation = MIGRATION_PARTAGES_ARCHIVE
+
+ if (grailsApplication.config.eliot.textes.migration.partages.archive != true) {
+ if (log.infoEnabled) {
+ log.info("L'opération $operation n'est pas activée (eliot.textes.migration.partages.archive)")
+ }
+ return
+ }
+
+ if (isTermine(operation)) {
+ if (log.infoEnabled) {
+ log.info("L'oprération $operation avait déjà été effectuée")
+ }
+ return
+ }
+
+ if (log.infoEnabled) {log.info("Début opération: " + operation)}
+
+ GormUtils.withFlushModeAndSession(FlushMode.MANUAL) {Session session ->
+
+ if (!isCommence(operation)) {
+ marqueCahiersArchievesAMigrer()
+ }
+
+ marqueDebutOperation(operation)
+
+ // On cumule le mapping entre les idExternes de groupes de direction
+ // et les établissement afin d'éviter d'interroger l'annuaire pour chaque CDT.
+ Map<String, Long> mapGroupeIdEtabId = [:]
+
+ for (
+ List<CahierDeTextes> cdts = findLotCahierDeTextesATraiter();
+ !cdts.isEmpty();
+ cdts = findLotCahierDeTextesATraiter()
+ ) {
+
+ CahierDeTextes.withTransaction {
+ cdts.each { CahierDeTextes cdt ->
+ mapGroupeIdEtabId = migrePermissionsCahiersArchivesSurGroupesLocaux(cdt, mapGroupeIdEtabId)
+ }
+
+ session.flush()
+
+ if (log.infoEnabled) {
+ log.info("Suppression des autorisations distants pour les CDT archivés. Nbr : ${cdts.size()}")
+ }
+ supprimeAllAutorisationGroupesDistants(cdts*.item)
+ clear()
+ }
+ }
+
+ marqueFinOperation(operation)
+ }
+
+ if (log.infoEnabled) {log.info('Fin opération: ' + operation)}
+ }
+
+
+ private void marqueCahiersArchievesAMigrer() {
+
+ String query = """
+ UPDATE entcdt.cahier_de_textes AS cahier
+ SET is_migre =
+ CASE
+ WHEN EXISTS (
+ SELECT * FROM entcdt.cahier_de_textes AS cdt
+ INNER JOIN ent.annee_scolaire AS annee
+ ON cdt.annee_scolaire_id = annee.id
+ WHERE cdt.id = cahier.id
+ AND cdt.service_id IS NULL
+ AND annee.annee_en_cours = false
+ )
+ THEN false
+ ELSE NULL
+ END
+ """
+
+ Session session = sessionFactory.getCurrentSession()
+ SQLQuery sqlQuery = session.createSQLQuery(query)
+
+ sqlQuery.executeUpdate()
+ }
+
+
+ private Map migrePermissionsCahiersArchivesSurGroupesLocaux(CahierDeTextes cdt,
+ Map<String, Long> mapGroupeIdEtabId) {
+
+ if (log.infoEnabled) {
+ log.info("Migration des partages pour le cahier archivé CahierDeTextes{id = ${cdt.id}, nom = ${cdt.nom}}")
+ }
+
+ List idExterneGroupeDistants = findAllIdExterneGroupeDistant(cdt.item)
+
+ idExterneGroupeDistants.each {String idExterneGroupeDistant ->
+
+ Long etabId = mapGroupeIdEtabId.get(idExterneGroupeDistant)
+
+ Etablissement etab = etabId == null ?
+ getEtabByIdExterneGroupeDistant(idExterneGroupeDistant, cdt) :
+ Etablissement.get(etabId)
+
+ if (!etab) {return}
+
+ if (etabId == null) {
+ mapGroupeIdEtabId.put(idExterneGroupeDistant, etab.id)
+ }
+
+ partageCahierAuGroupeDirection(cdt, etab)
+ }
+
+ cdt.isMigre = true
+ cdt.save(failOnError: true)
+
+ return mapGroupeIdEtabId
+ }
+
+
+ private Etablissement getEtabByIdExterneGroupeDistant(String idExterneGroupeDistant,
+ CahierDeTextes cdt) {
+
+ GroupeInfo groupe = annuaireService.getGroupeInfo(idExterneGroupeDistant)
+
+ if (!groupe) {
+ log.warn("Le groupe distant pour l'idExterne $idExterneGroupeDistant n'est pas trouvé")
return
}
- Sql sql = new Sql(dataSource)
- String query =
- """
- DELETE FROM securite.autorisation WHERE id IN (
- SELECT autorisation.id FROM securite.autorisation AS autorisation
- INNER JOIN securite.autorite AS autorite ON autorisation.autorite_id = autorite.id
- INNER JOIN securite.item AS item ON autorisation.item_id = item.id
- INNER JOIN entcdt.cahier_de_textes AS cahier ON cahier.item_id = item.id
-
- WHERE autorite.type = 'groupe'
- AND autorite.localisation = 'DISTANTE'
- AND autorisation.valeur_permissions_explicite_defaut !=0
- AND cahier.id IN (${getSqlParametresListLong(cdtIds)})
- )
+ if (groupe.fonction != GroupeInfo.FONCTION_PERSONNEL_DIRECTION) {
+ log.warn("Le cahier archivé (id = ${cdt.id}) est partagé avec un groupe distant " +
+ "qui n'est un groupe de direction (idExterne = $idExterneGroupeDistant)")
+ return
+ }
+
+ String etabIdExterne = groupe.getEtablissementId()
+ Etablissement etab = Etablissement.findByIdExterne(etabIdExterne)
+
+ if (!etab) {
+ throw new IllegalStateException("L'établissement correspondant à l'idExterne = $etabIdExterne n'existe pas")
+ }
+
+ return etab
+ }
+
+
+ private void partageCahierAuGroupeDirection(CahierDeTextes cdt, Etablissement etab) {
+ Autorite autorite = localGroupeService.findOrCreeGroupeDeDirection(etab).autorite
+
+ SecuriteSession securiteSession = getSecuriteSessionSystem(etab)
+
+ PermissionsManager permManager = new DefaultPermissionsManager(
+ cdt.item,
+ autorite,
+ securiteSession
+ )
+
+ permManager.addPermissionConsultation()
+ }
+
+
+ private void migrePartagesManuel() {
+ //TOIMP ...
+
+ }
+
+
+ public static final String GET_CDT_A_TRAITER = """
+ SELECT cahier
+ FROM CahierDeTextes as cahier
+ INNER JOIN FETCH cahier.item
+ WHERE cahier.isMigre = false
"""
- sql.executeUpdate(query)
+ private List<CahierDeTextes> findLotCahierDeTextesATraiter() {
+
+ return CahierDeTextes.executeQuery(
+ GET_CDT_A_TRAITER,
+ [:],
+ [max: 20, offset: 0]
+ )
}
}