DemandeTraitementService demandeTraitementService
ActionPossibleService actionPossibleService
CahierDeTextesImpressionService cahierDeTextesImpressionService
+ TextesImpressionStockageService textesImpressionStockageService
DocbookService docbookService
private static String CDT_COMPLET = "complet"
List<CahierDeTextes> cdts = CahierDeTextes.getAll(param.ids)
if (param.plusieursCahiers) {
- imprimePlusieursCdt(param, cdts)
+ imprimePlusieursCdt(demande, param, cdts)
} else {
- imprimeUnCdt(param, cdts.first())
+ imprimeUnCdt(demande, param, cdts.first())
}
} catch (Exception ex) {
log.error("Error lors du traitement de la demande ${demande.id}", ex)
}
- private void imprimeUnCdt(TextesImpressionParam param, CahierDeTextes cdt) {
+ private void imprimeUnCdt(DemandeTraitement demande,
+ TextesImpressionParam param,
+ CahierDeTextes cdt) {
ElementLivre donnees =
cahierDeTextesImpressionService.findDonneesImpression(
OutputStream documentPDF =
docbookService.renderPdfPourUnCdt(CDT_COMPLET, [infosCahiers: donnees])
-
- //TOIMP bper : stockage de fichier
+ textesImpressionStockageService.saveFichierPDF(demande, documentPDF)
}
- private void imprimePlusieursCdt(TextesImpressionParam param, List<CahierDeTextes> cdts) {
+ private void imprimePlusieursCdt(DemandeTraitement demande,
+ TextesImpressionParam param,
+ List<CahierDeTextes> cdts) {
List<ElementLivre> donnees = cdts.collect {
cahierDeTextesImpressionService.findDonneesImpression(
OutputStream documentPDF =
docbookService.renderPdfPourPlusieursCdt(CDT_COMPLET, [donnees: donnees])
-
- //TOIMP bper : stockage de fichier
+ textesImpressionStockageService.saveFichierPDF(demande, documentPDF)
}
--- /dev/null
+package org.lilie.services.eliot.textes.impression
+
+import org.lilie.services.eliot.demon.DemandeTraitement
+import org.lilie.services.eliot.scolarite.Etablissement
+import org.lilie.services.eliot.demon.impl.DefaultTraitementType
+import java.text.SimpleDateFormat
+import org.lilie.services.eliot.scolarite.AnneeScolaire
+import org.lilie.services.eliot.scolarite.anneescolaire.AnneeScolaireService
+import org.codehaus.groovy.grails.commons.ConfigurationHolder
+
+class TextesImpressionStockageService {
+
+ static transactional = false
+
+ AnneeScolaireService anneeScolaireService
+
+ private final static String PREFIX_ETAB = 'ETAB_'
+ private final static String TRAITEMENT = 'IMPRESSION'
+
+
+ /**
+ * @param demandeTraitement la demande de traitement du publipostage
+ * @return un flux en lecture sur le fichier de publipostage
+ */
+ FileInputStream getFichierInputStream(DemandeTraitement demandeTraitement) {
+ verifieTypeDemande(demandeTraitement)
+
+ String cheminDossier = calculeCheminDossier(demandeTraitement)
+
+ String nomFichier = calculeNomFichier(demandeTraitement)
+ String cheminFichier = "$cheminDossier/$nomFichier"
+
+ if (!fichierExiste(cheminDossier, nomFichier)) {
+ throw new TextesImpressionException("Le fichier $cheminFichier n'exite pas")
+ }
+
+ try {
+ return new FileInputStream(cheminFichier)
+ } catch (FileNotFoundException e) {
+ throw new TextesImpressionException(
+ "Le fichier $cheminFichier n'a pas pu être ouvert",
+ e
+ )
+ }
+ }
+
+
+ void saveFichierPDF(DemandeTraitement demandeTraitement, OutputStream documentPDF) {
+ FileOutputStream fichierPDF = getFichierOutputStream(demandeTraitement)
+ fichierPDF << documentPDF
+ fichierPDF.flush()
+ fichierPDF.close()
+ documentPDF.close()
+ }
+
+
+ /**
+ * Obtient ou créé le fichier d'impression en PDF,
+ * et retourne un flux en écriture sur ce fichier
+ * @param demandeTraitement la demande de traitement d'impression
+ * @return un flux en écriture sur le fichier d'impression
+ */
+ FileOutputStream getFichierOutputStream(DemandeTraitement demandeTraitement) {
+ verifieTypeDemande(demandeTraitement)
+
+ String cheminDossier = calculeCheminDossier(demandeTraitement)
+
+ forceCreationDossier(cheminDossier)
+
+ String nomFichier = calculeNomFichier(demandeTraitement)
+ String cheminFichier = "$cheminDossier/$nomFichier"
+
+ if (fichierExiste(cheminDossier, nomFichier)) {
+ throw new TextesImpressionException(
+ "Le fichier $nomFichier ne peut pas etre créé car existe déjà")
+ }
+
+ try {
+ return new FileOutputStream(cheminFichier, true)
+ } catch (FileNotFoundException e) {
+ throw new TextesImpressionException(
+ "Le fichier $cheminFichier n'a pas pu être créé", e)
+ }
+ }
+
+ /**
+ * Vérifie que le fichier à générer existe
+ * @return true si le fichier existe
+ */
+ private Boolean fichierExiste(String cheminDossier,
+ String nomFichier) {
+ File fichier = new File("$cheminDossier/$nomFichier")
+ return fichier.exists()
+ }
+
+ /**
+ * Vérifie que le chemin complet existe, et crée les dossiers si besoin
+ */
+ private void forceCreationDossier(String cheminDossier) {
+ File dossier = new File(cheminDossier)
+ if (!dossier.exists()) {
+ dossier.mkdirs()
+ }
+ }
+
+ /**
+ * Calcule le chemin du fichier correspondant à la demande de traitement
+ */
+ private String calculeCheminDossier(DemandeTraitement demandeTraitement) {
+
+ String racine = ConfigurationHolder.config.eliot.textes.impression.stockageFichier.chemin
+
+ if (!racine) {
+ throw new IllegalStateException(
+ "Le paramètre de config eliot.textes.impression.stockageFichier.chemin" +
+ "n'est pas défini")
+ }
+
+ Etablissement etab = Etablissement.get(demandeTraitement.etablissementId)
+ AnneeScolaire anneeScolaire = anneeScolaireService.anneeScolaireEnCours()
+ SimpleDateFormat sdf = new SimpleDateFormat('yyyyMMdd', Locale.FRANCE)
+ String date = sdf.format(demandeTraitement.dateDemande)
+
+ return "$racine/$TRAITEMENT/$PREFIX_ETAB${etab.uai}/${anneeScolaire.code}/$date"
+ }
+
+
+ private String calculeNomFichier(DemandeTraitement demandeTraitement) {
+ return construitNomFichier(
+ demandeTraitement.traitementType.toString(),
+ demandeTraitement.id.toString())
+ }
+
+
+ private String construitNomFichier(String type, String id) {
+ return "${type}_${id}.pdf"
+ }
+
+ /**
+ * Vérifie que la demande de traitement porte bien sur une demande de type
+ * IMPRESSION_CDT, sinon lève une IllegalArgumentException
+ */
+ private void verifieTypeDemande(DemandeTraitement demandeTraitement) {
+ if (demandeTraitement.traitementType != DefaultTraitementType.IMPRESSION_CDT) {
+ throw new IllegalArgumentException(
+ "La demande de traitement n'est pas de type ${DefaultTraitementType.IMPRESSION_CDT}"
+ )
+ }
+ }
+
+ /**
+ * Vérifie si le fichier généré par le traitement de la demande existe.
+ */
+ Boolean fichierExiste(DemandeTraitement demandeTraitement) {
+
+ String cheminDossier = calculeCheminDossier(demandeTraitement)
+ String nomFichier = calculeNomFichier(demandeTraitement)
+ return fichierExiste(cheminDossier, nomFichier)
+ }
+}