import grails.converters.JSON
import org.codehaus.groovy.grails.web.converters.exceptions.ConverterException
+import org.lilie.services.eliot.temps.DateUtil
class RestBackofficeConfigController {
render (baseEleves.collect{it.toMap()}.encodeAsJSON())
}
+ /**
+ * WebService permettant de lister les derniers imports UDT
+ * exemple de réponse :
+ * [{ "uai":"0000000A",
+ * "nom":"Honoré de Balzac",
+ * "debutImport":"2013-04-12 11:34:26.286",
+ * "finImport":"2013-09-09 00:00:00.0",
+ * "nbrEventTraites":0,
+ * "nbrEventEnAttente":208,
+ * "nbrEventEnErreur":0,
+ * "nbrEventIgnores":0},...]
+ *
+ *
+ * Paramètres à passer dans l'url de la requête :
+ *
+ * uai (optionnel) : (uai d'un établissement)
+ * debutImport (optionnel) : (date à partir de laquelle il faut remonter les infos
+ * attendue au format 'dd/MM/yyyy')
+ */
+ def showDerniersImportsUDT = {
+ response.characterEncoding = "utf-8"
+ Map filtre = [:]
+ if (params.uai) {filtre.uai = params.uai}
+ if (params.debutImport) {
+ filtre.debutImport = DateUtil.parse(params.debutImport, 'dd/MM/yyyy')
+ }
+
+ List importsUdt = backofficeService.listeImportsUdt(filtre)
+ render(importsUdt.encodeAsJSON())
+ }
+
}
package org.lilie.services.eliot.backoffice
+import groovy.sql.Sql
import org.lilie.services.eliot.api.backoffice.BackofficeConfigSaveParam
import org.lilie.services.eliot.annuaire.PersonneProprietesScolarite
+import java.sql.Timestamp
+
class BackofficeService {
+ def dataSource
/**
* Création ou mise à jour d'une config d'établissement pour le back-office
return BaseEleve.findAll("from BaseEleve as b order by b.code")
}
+ /**
+ * Liste les imports UDT
+ * @param filtre (uai et debutImport : optionnels tous les 2)
+ * @return
+ */
+ List listeImportsUdt(def filtre){
+
+ List importsUdt = []
+
+ def sql = new Sql(dataSource)
+ List params = []
+ String requeteSql = """
+ with
+ evenements_traites as (
+ select
+ e.udt_import_id, count(*) as nbr
+ from
+ udt.evenement as e
+ where
+ e.etat = 'TRAITE'
+ group by
+ e.udt_import_id
+ ),
+ evenements_en_attente as (
+ select
+ e.udt_import_id, count(*) as nbr
+ from
+ udt.evenement as e
+ where
+ e.etat = 'EN_ATTENTE'
+ group by
+ e.udt_import_id
+ ),
+ evenements_en_erreur as (
+ select
+ e.udt_import_id, count(*) as nbr
+ from
+ udt.evenement as e
+ where
+ e.etat = 'ERREUR'
+ group by
+ e.udt_import_id
+ ),
+ evenements_ignores as (
+ select
+ e.udt_import_id, count(*) as nbr
+ from
+ udt.evenement as e
+ where
+ e.etat = 'IGNORE'
+ group by
+ e.udt_import_id
+ ),
+ derniere_semaine_importee as (
+ select
+ s.udt_import_id, max(s.date_fin_import) as date
+ from
+ udt.semaine_importee as s
+ group by
+ s.udt_import_id
+ ),
+ import_semaine_en_cours as (
+ select
+ s.udt_import_id, count(*) as nbr
+ from
+ udt.semaine_importee as s
+ where
+ s.date_fin_import is null
+ group by
+ s.udt_import_id
+ )
+ select
+ i.id,
+ e.uai,
+ e.nom_affichage,
+ i.date_debut_pre_traitement,
+ i.date_fin_pre_traitement,
+ coalesce(evenements_traites.nbr, 0) as nbr_traites,
+ coalesce(evenements_en_attente.nbr,0) as nbr_en_attente,
+ coalesce(evenements_en_erreur.nbr,0) as nbr_en_erreur,
+ coalesce(evenements_ignores.nbr,0) as nbr_ignores,
+ derniere_semaine_importee.date as date_fin_import,
+ coalesce(import_semaine_en_cours.nbr, 0) as nbr_import_semaine_en_cours
+ from
+ udt.import as i
+ inner join
+ ent.etablissement as e on i.etablissement_id = e.id
+ left join
+ evenements_traites on evenements_traites.udt_import_id = i.id
+ left join
+ evenements_en_attente on evenements_en_attente.udt_import_id = i.id
+ left join
+ evenements_en_erreur on evenements_en_erreur.udt_import_id = i.id
+ left join
+ evenements_ignores on evenements_ignores.udt_import_id = i.id
+ left join
+ derniere_semaine_importee on derniere_semaine_importee.udt_import_id = i.id
+ left join
+ import_semaine_en_cours on import_semaine_en_cours.udt_import_id = i.id
+ where
+ 1 = 1
+ """
+ if(filtre.uai) {
+ requeteSql += " and e.uai like ?"
+ params << filtre.uai
+ }
+ if(filtre.debutImport) {
+ requeteSql += " and i.date_debut_pre_traitement >= ?"
+ params << filtre.debutImport.toTimestamp()
+ }
+
+ requeteSql += " order by e.uai asc, i.date_debut_pre_traitement desc"
+
+ sql.eachRow(requeteSql, params) {row ->
+ Map mapImport = [:]
+ mapImport.uai = row.getProperty('uai')
+ mapImport.nom = row.getProperty('nom_affichage')
+ mapImport.debutImport = row.getProperty('date_debut_pre_traitement').toString()
+ mapImport.finImport = dateFinImport(
+ row.getProperty('date_fin_pre_traitement'),
+ row.getProperty('date_fin_import'),
+ row.getProperty('nbr_import_semaine_en_cours'),
+ row.getProperty('nbr_en_attente')
+ )
+ mapImport.nbrEventTraites = row.getProperty('nbr_traites')
+ mapImport.nbrEventEnAttente = row.getProperty('nbr_en_attente')
+ mapImport.nbrEventEnErreur = row.getProperty('nbr_en_erreur')
+ mapImport.nbrEventIgnores = row.getProperty('nbr_ignores')
+ importsUdt << mapImport
+ }
+
+ sql.close()
+ return importsUdt
+
+ }
+
+ /**
+ * Date de fin d'import à remvoyer par listeImportsUdt
+ * @param dateFinPreTraitement
+ * @param dateFinImport
+ * @param nbrImportSemaineEnCours
+ * @param nbrEventEnAttente
+ * @return
+ */
+ private String dateFinImport(
+ Timestamp dateFinPreTraitement,
+ Timestamp dateFinImport,
+ Long nbrImportSemaineEnCours,
+ Long nbrEventEnAttente
+ ) {
+ String dateARetourner = null
+ if(dateFinImport) {
+ dateARetourner = dateFinImport
+ } else {
+ if(nbrImportSemaineEnCours == 0 ||
+ nbrImportSemaineEnCours > 0 && nbrEventEnAttente == 0) {
+ // aucun évènement importé, par convention dateFinImport = dateFinPretraitement
+ dateARetourner = dateFinPreTraitement
+ }
+ }
+ return dateARetourner
+ }
}
\ No newline at end of file