def __init__(self,
                 annee=2009,
                 mois=12,
                 listeIDpersonnes=[],
                 dictPersonnes={},
                 afficher_we=True,
                 afficher_vacances=True,
                 afficher_feries=True,
                 afficher_heures=True,
                 afficher_couleurs_categories=True,
                 afficher_legende=True,
                 afficher_heures_mois=True):

        self.annee = annee
        self.mois = mois
        self.listeIDpersonnes = listeIDpersonnes
        self.dictPersonnes = dictPersonnes

        listeMois = (_(u"Janvier"), _(u"Février"), _(u"Mars"), _(u"Avril"),
                     _(u"Mai"), _(u"Juin"), _(u"Juillet"), _(u"Août"),
                     _(u"Septembre"), _(u"Octobre"), _(u"Novembre"),
                     _(u"Décembre"))
        listeJours = (u"L", u"M", u"M", u"J", u"V", u"S", u"D")

        global AFFICHER_WE, AFFICHER_VACANCES, AFFICHER_FERIES, AFFICHER_HEURES, AFFICHER_COULEUR_CATEGORIES, AFFICHER_LEGENDE, AFFICHER_HEURES_MOIS
        AFFICHER_WE = afficher_we
        AFFICHER_VACANCES = afficher_vacances
        AFFICHER_FERIES = afficher_feries
        AFFICHER_HEURES = afficher_heures
        AFFICHER_COULEUR_CATEGORIES = afficher_couleurs_categories
        AFFICHER_LEGENDE = afficher_legende
        AFFICHER_HEURES_MOIS = afficher_heures_mois

        # Paramètres du PDF
        nomDoc = UTILS_Fichiers.GetRepTemp("Impression_calendrier_mensuel.pdf")
        if "win" in sys.platform: nomDoc = nomDoc.replace("/", "\\")
        taillePage = landscape(A4)
        HAUTEUR_PAGE = defaultPageSize[0]
        LARGEUR_PAGE = defaultPageSize[1]

        doc = SimpleDocTemplate(nomDoc,
                                pagesize=taillePage,
                                leftMargin=40,
                                rightMargin=40,
                                topMargin=40,
                                bottomMargin=40)
        story = []

        # Création du titre du document
        largeursColonnesTitre = ((630, 100))
        dateDuJour = DatetimeDateEnStr(datetime.date.today())
        dataTableauTitre = [
            (_(u"Planning de %s %d") % (listeMois[self.mois - 1], self.annee),
             _(u"Edité le %s") % dateDuJour),
        ]
        styleTitre = TableStyle([
            ('BOX', (0, 0), (-1, -1), 0.25, colors.black),
            ('VALIGN', (0, 0), (-1, -1), 'TOP'),
            ('ALIGN', (0, 0), (0, 0), 'LEFT'),
            ('FONT', (0, 0), (0, 0), "Helvetica-Bold", 16),
            ('ALIGN', (1, 0), (1, 0), 'RIGHT'),
            ('FONT', (1, 0), (1, 0), "Helvetica", 6),
        ])
        tableauTitre = Table(dataTableauTitre, largeursColonnesTitre)
        tableauTitre.setStyle(styleTitre)
        story.append(tableauTitre)
        story.append(Spacer(0, 20))

        # Récupération des données
        ##        self.dictPersonnes = ImportPersonnes(annee, mois)
        self.dictPresences, self.dictTotauxCategories = self.ImportPresences(
            self.annee, self.mois)
        nbrePersonnes = len(self.listeIDpersonnes)

        global DICT_CATEGORIES, LISTE_VACANCES, LISTE_FERIES
        DICT_CATEGORIES = self.ImportCategories()
        LISTE_VACANCES = self.Importation_Vacances()
        LISTE_FERIES = self.Importation_Feries()

        # Création du tableau
        dataTableau = []
        enteteTableau = []
        largeursColonnes = []
        styleTableau = []

        # Création de l'entete du tableau
        numWeekDay, nbreJoursMois = calendar.monthrange(self.annee, self.mois)
        numJourSemaine = numWeekDay

        largeurColonnes = 19
        largeurColonneTotal = 25
        largeurColonneNom = 730 - (largeurColonnes * nbreJoursMois +
                                   1) - largeurColonneTotal

        # Colonne Nom personne
        largeursColonnes.append(largeurColonneNom)
        enteteTableau.append(u"")
        # Colonnes Dates
        for numJour in range(1, nbreJoursMois + 1):
            largeursColonnes.append(largeurColonnes)
            labelColonne = u"%s %d" % (listeJours[numJourSemaine], numJour)
            dateDD = datetime.date(year=self.annee,
                                   month=self.mois,
                                   day=numJour)
            case = CaseDate(xoffset=0,
                            hauteurCase=12,
                            largeurCase=largeurColonnes,
                            dateDD=dateDD,
                            dictBarres={},
                            labelDate=labelColonne)
            enteteTableau.append(case)
            numJourSemaine += 1
            if numJourSemaine == 7:
                numJourSemaine = 0
        # Colonne Total mois
        largeursColonnes.append(largeurColonneTotal)
        enteteTableau.append(_(u"Total"))

        dataTableau.append(enteteTableau)
        styleTableau.append(('ALIGN', (0, 0), (-1, 0), 'CENTRE'))
        styleTableau.append(('FONT', (0, 0), (-1, 0), "Helvetica-Bold", 8))

        # Création des lignes vides
        for IDpersonne in self.listeIDpersonnes:
            # Entete ligne
            nom = self.dictPersonnes[IDpersonne]["nom"]
            prenom = self.dictPersonnes[IDpersonne]["prenom"]
            nomComplet = u"%s %s  " % (nom, prenom)
            ligne = [
                nomComplet,
            ]
            # Cases dates
            totalMinutesMois = 0
            for numJour in range(1, nbreJoursMois + 1):
                dateDD = datetime.date(year=self.annee,
                                       month=self.mois,
                                       day=numJour)
                if dateDD in self.dictPresences[IDpersonne]:
                    totalMinutesMois += self.dictPresences[IDpersonne][dateDD][
                        "totalJour"]
                    dictBarres = self.dictPresences[IDpersonne][dateDD]
                    case = CaseDate(xoffset=0,
                                    hauteurCase=12,
                                    largeurCase=largeurColonnes,
                                    dateDD=dateDD,
                                    dictBarres=dictBarres)
                    ligne.append(case)
                else:
                    ligne.append(None)
            # Colonne Total Mois
            if AFFICHER_HEURES_MOIS == True and totalMinutesMois != 0:
                total = minutesEnHeures(totalMinutesMois)
                ligne.append(total)
            dataTableau.append(ligne)

        # Style général du tableau
        styleTableau.append(('FONT', (0, 1), (-1, -1), "Helvetica", 6))
        styleTableau.append(('LEFTPADDING', (0, 0), (-1, -1), 0))
        styleTableau.append(('RIGHTPADDING', (0, 0), (-1, -1), 0))
        styleTableau.append(('TOPPADDING', (0, 0), (-1, -1), 0))
        styleTableau.append(('BOTTOMPADDING', (0, 0), (-1, -1), 0))
        styleTableau.append(('ALIGN', (0, 0), (0, -1), "RIGHT"))
        styleTableau.append(('VALIGN', (0, 0), (0, -1), "MIDDLE"))
        styleTableau.append(('GRID', (1, 0), (-1, 0), 0.25, colors.black))
        styleTableau.append(('GRID', (0, 1), (-1, -1), 0.25, colors.black))

        styleTableau.append(('ALIGN', (-1, 0), (-1, -1), "CENTRE"))
        styleTableau.append(('VALIGN', (-1, 0), (-1, -1), "MIDDLE"))
        styleTableau.append(('FONT', (-1, 0), (-1, -1), "Helvetica", 5))

        tableau = Table(dataTableau, largeursColonnes)
        tableau.setStyle(TableStyle(styleTableau))
        story.append(tableau)
        story.append(Spacer(0, 25))

        #------------------LEGENDE-------------------

        # Légendes des catégories
        dataTableauLegende = []
        largeursColonnesLegende = []
        styleTableauLegende = []

        # Création des lignes vides du tableau des légendes
        nbreLignesLegendes = 5
        nbreColonnesLegendes = 4
        largeurColonneLegende = 178.75

        for numLigne in range(0, nbreLignesLegendes):
            ligne = []
            for numCol in range(0, nbreColonnesLegendes):
                ligne.append(None)
            dataTableauLegende.append(ligne)

        # Création de la liste des largeurs des colonnes
        for x in range(0, nbreColonnesLegendes):
            largeursColonnesLegende.append(largeurColonneLegende)

        # Remplissage du tableau des légendes
        nbre_legendes = 0
        total_heures = 0
        numLigne = 0
        numCol = 0

        if AFFICHER_VACANCES == True:
            dataTableauLegende[numLigne][numCol] = CaseLegende(
                0, 10, _(u"Vacances"), COULEUR_VACANCES, None)
            numLigne += 1
        if AFFICHER_WE == True:
            dataTableauLegende[numLigne][numCol] = CaseLegende(
                0, 10, _(u"Week-ends"), COULEUR_WE, None)
            numLigne += 1
        if AFFICHER_FERIES == True:
            dataTableauLegende[numLigne][numCol] = CaseLegende(
                0, 10, _(u"Jours fériés"), COULEUR_FERIES, None)
            numLigne += 1

        for IDcategorie, nbreHeures in self.dictTotauxCategories.items():
            if IDcategorie != "totalMois":
                nom_categorie, ordre, couleur = DICT_CATEGORIES[IDcategorie]
                legende = CaseLegende(0, 10, nom_categorie, couleur,
                                      nbreHeures)
                dataTableauLegende[numLigne][numCol] = legende
                nbre_legendes += 1
                total_heures += nbreHeures

                numLigne += 1
                if numLigne == nbreLignesLegendes:
                    numLigne = 0
                    numCol += 1

        if nbre_legendes > 1:
            # Ajoute un total d'heures pour l'année
            legende = CaseLegende(0, 10, _(u"Total pour le mois"), None,
                                  total_heures)
            dataTableauLegende[numLigne][numCol] = legende

        styleTableauLegende.append(('FONT', (0, 1), (-1, -1), "Helvetica", 6))
        styleTableauLegende.append(('LEFTPADDING', (0, 0), (-1, -1), 0))
        styleTableauLegende.append(('RIGHTPADDING', (0, 0), (-1, -1), 0))
        styleTableauLegende.append(('TOPPADDING', (0, 0), (-1, -1), 0))
        styleTableauLegende.append(('BOTTOMPADDING', (0, 0), (-1, -1), 0))

        tableauLegende = Table(dataTableauLegende, largeursColonnesLegende)
        tableauLegende.setStyle(TableStyle(styleTableauLegende))
        if AFFICHER_LEGENDE == True:
            story.append(tableauLegende)

        # Enregistrement du PDF
        doc.build(story)
        # Affichage du PDF
        FonctionsPerso.LanceFichierExterne(nomDoc)
    def OnBoutonOk(self, event):
        dictOptions = self.ctrl_parametres.GetOptions()
        if dictOptions == False:
            return

        # Récupération des paramètres
        listeIDfactures = []
        montantTotal = FloatToDecimal(0.0)
        for track in self.tracks:
            listeIDfactures.append(track.IDfacture)
            montantTotal += track.total

        if len(listeIDfactures) == 0: conditionFactures = "()"
        elif len(listeIDfactures) == 1:
            conditionFactures = "(%d)" % listeIDfactures[0]
        else:
            conditionFactures = str(tuple(listeIDfactures))

        DB = GestionDB.DB()
        req = """
        SELECT prestations.IDprestation, prestations.IDfacture, prestations.label, prestations.montant, 
        prestations.IDindividu, individus.nom, individus.prenom,
        prestations.IDactivite, activites.nom
        FROM prestations
        LEFT JOIN individus ON prestations.IDindividu = individus.IDindividu
        LEFT JOIN activites ON activites.IDactivite = prestations.IDactivite
        WHERE prestations.IDfacture IN %s
        GROUP BY prestations.IDprestation
        ORDER BY prestations.date
        ;""" % conditionFactures
        DB.ExecuterReq(req)
        listePrestations = DB.ResultatReq()

        # Récupération des prélèvements
        req = """SELECT
            prelevements.IDprelevement, prelevements.prelevement_iban,
            prelevements.IDfacture, lots_prelevements.date,
            prelevement_reference_mandat, titulaire
            FROM prelevements
            LEFT JOIN lots_prelevements ON lots_prelevements.IDlot = prelevements.IDlot
            WHERE prelevements.IDfacture IN %s
            ;""" % conditionFactures
        DB.ExecuterReq(req)
        listePrelevements = DB.ResultatReq()
        # Pièces PES ORMC
        req = """SELECT
            pes_pieces.IDpiece, pes_pieces.prelevement_iban, pes_pieces.IDfacture,
            pes_lots.date_prelevement, pes_pieces.prelevement_IDmandat, pes_pieces.prelevement_titulaire
            FROM pes_pieces
            LEFT JOIN pes_lots ON pes_lots.IDlot = pes_pieces.IDlot
            WHERE pes_pieces.prelevement_IDmandat IS NOT NULL AND pes_pieces.prelevement=1 AND pes_pieces.IDfacture IN %s
            ;""" % conditionFactures
        DB.ExecuterReq(req)
        listePieces = DB.ResultatReq()
        dictPrelevements = {}
        for listeDonneesPrel in (listePrelevements, listePieces):
            for IDprelevement, iban, IDfacture, datePrelevement, rum, titulaire in (
                    listeDonneesPrel):
                datePrelevement = UTILS_Dates.DateEngFr(datePrelevement)
                dictPrelevements[IDfacture] = {
                    "IDprelevement": IDprelevement,
                    "datePrelevement": datePrelevement,
                    "iban": iban,
                    "rum": rum,
                    "titulaire": titulaire
                }

        DB.Close()
        # Calcul totaux prélèvements
        nbrFactPrelev = len(dictPrelevements)
        montantTotalPrelev = 0.0
        for track in self.tracks:
            if track.IDfacture in dictPrelevements:
                montantTotalPrelev += -track.solde

        dictPrestations = {}
        dictIndividus = {}
        dictActivites = {}
        dictTotaux = {}
        for IDprestation, IDfacture, label, montant, IDindividu, nom, prenom, IDactivite, nomActivite in listePrestations:

            if dictActivites != None and (IDactivite
                                          in dictActivites) == False:
                dictActivites[IDactivite] = nomActivite

            if IDindividu != None and (
                    IDindividu in dictIndividus) == False and prenom != None:
                dictIndividus[IDindividu] = u"%s %s" % (nom, prenom)

            if (IDfacture in dictPrestations) == False:
                dictPrestations[IDfacture] = {}
            if (IDindividu in dictPrestations[IDfacture]) == False:
                dictPrestations[IDfacture][IDindividu] = {}
            if (label in dictPrestations[IDfacture][IDindividu]) == False:
                dictPrestations[IDfacture][IDindividu][label] = {
                    "quantite": 0,
                    "montant": 0.0,
                    "IDactivite": IDactivite
                }

            if (IDactivite in dictTotaux) == False:
                dictTotaux[IDactivite] = {}
            if (label in dictTotaux[IDactivite]) == False:
                dictTotaux[IDactivite][label] = {"quantite": 0, "montant": 0.0}

            dictTotaux[IDactivite][label]["quantite"] += 1
            dictTotaux[IDactivite][label]["montant"] += montant

            dictPrestations[IDfacture][IDindividu][label]["quantite"] += 1
            dictPrestations[IDfacture][IDindividu][label]["montant"] += montant

        # Création du PDF
        from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, PageBreak
        from reportlab.platypus.flowables import ParagraphAndImage, Image
        from reportlab.rl_config import defaultPageSize
        from reportlab.lib.units import inch, cm
        from reportlab.lib.utils import ImageReader
        from reportlab.lib import colors
        from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
        self.hauteur_page = defaultPageSize[1]
        self.largeur_page = defaultPageSize[0]

        # Initialisation du PDF
        PAGE_WIDTH, PAGE_HEIGHT = defaultPageSize
        nomDoc = FonctionsPerso.GenerationNomDoc("RECAP_FACTURES", "pdf")
        if sys.platform.startswith("win"): nomDoc = nomDoc.replace("/", "\\")
        doc = SimpleDocTemplate(nomDoc, topMargin=30, bottomMargin=30)
        story = []

        largeurContenu = 520

        # Création du titre du document
        def Header():
            dataTableau = []
            largeursColonnes = ((420, 100))
            dateDuJour = UTILS_Dates.DateEngFr(str(datetime.date.today()))
            dataTableau.append(
                (dictOptions["titre_texte"], _(u"%s\nEdité le %s") %
                 (UTILS_Organisateur.GetNom(), dateDuJour)))
            style = TableStyle([
                ('BOX', (0, 0), (-1, -1), 0.25, colors.black),
                ('VALIGN', (0, 0), (-1, -1), 'TOP'),
                ('ALIGN', (0, 0), (0, 0),
                 ConvertAlignement1(dictOptions["titre_alignement"])),
                ('FONT', (0, 0), (0, 0), "Helvetica-Bold",
                 dictOptions["titre_taille_texte"]),
                ('ALIGN', (1, 0), (1, 0), 'RIGHT'),
                ('FONT', (1, 0), (1, 0), "Helvetica", 6),
            ])
            tableau = Table(dataTableau, largeursColonnes)
            tableau.setStyle(style)
            story.append(tableau)
            story.append(Spacer(0, 20))

        # Insère un header
        Header()

        couleurFond1 = ConvertCouleurWXpourPDF(dictOptions["couleur_fond_1"])
        couleurFond2 = ConvertCouleurWXpourPDF(dictOptions["couleur_fond_2"])

        styleIntroduction = ParagraphStyle(
            name="introduction",
            fontName="Helvetica",
            alignment=ConvertAlignement2(dictOptions["intro_alignement"]),
            fontSize=dictOptions["intro_taille_texte"],
            spaceAfter=0,
            leading=8,
            spaceBefore=0)
        styleConclusion = ParagraphStyle(
            name="conclusion",
            fontName="Helvetica",
            alignment=ConvertAlignement2(dictOptions["conclusion_alignement"]),
            fontSize=dictOptions["conclusion_taille_texte"],
            spaceAfter=0,
            leading=8,
            spaceBefore=0)

        styleLabel = ParagraphStyle(name="label",
                                    fontName="Helvetica",
                                    alignment=1,
                                    fontSize=5,
                                    spaceAfter=0,
                                    leading=8,
                                    spaceBefore=0)
        styleTexte = ParagraphStyle(name="label",
                                    fontName="Helvetica",
                                    alignment=0,
                                    fontSize=7,
                                    spaceAfter=0,
                                    leading=8,
                                    spaceBefore=0)
        styleTexte2 = ParagraphStyle(name="label",
                                     fontName="Helvetica",
                                     alignment=1,
                                     fontSize=7,
                                     spaceAfter=0,
                                     leading=8,
                                     spaceBefore=0)
        styleMontant = ParagraphStyle(name="label",
                                      fontName="Helvetica",
                                      alignment=2,
                                      fontSize=7,
                                      spaceAfter=0,
                                      leading=8,
                                      spaceBefore=0)

        # Intro
        story.append(Paragraph(dictOptions["intro_texte"], styleIntroduction))
        story.append(Spacer(0, 20))

        # Factures
        if dictOptions["type_document"] in (0, 1):

            for track in self.tracks:

                numero = track.numero
                if track.etat == "annulation":
                    numero = u"%s (Annulée)" % numero

                solde = track.solde
                if solde != 0.0:
                    solde = -solde

                # Numéro de facture
                dataTableau = []
                largeursColonnes = [100, 100, largeurContenu - 100 - 100]
                dataTableau.append((
                    _(u"Facture n°%s") % numero,
                    u"%.2f %s" % (solde, SYMBOLE),
                    _(u"Edité le %s | Echéance le %s | Période du %s au %s")
                    % (UTILS_Dates.DateDDEnFr(track.date_edition),
                       UTILS_Dates.DateDDEnFr(track.date_echeance),
                       UTILS_Dates.DateDDEnFr(track.date_debut),
                       UTILS_Dates.DateDDEnFr(track.date_fin)),
                ))
                tableau = Table(dataTableau, largeursColonnes)
                listeStyles = [
                    ('FONT', (0, 0), (1, -1), "Helvetica-Bold", 7),
                    ('FONT', (2, -1), (2, -1), "Helvetica", 6),
                    ('BACKGROUND', (0, 0), (-1, -1), couleurFond1),
                    ('ALIGN', (2, -1), (2, -1), 'RIGHT'),
                    ('BOX', (0, 0), (-1, -1), 0.25, colors.black),
                ]
                tableau.setStyle(TableStyle(listeStyles))
                story.append(tableau)

                # Famille
                if track.prelevement == True:
                    if track.IDfacture in dictPrelevements:
                        textePrelevement = _(
                            u"IBAN : %s | RUM : %s | Titulaire : %s | Le : %s "
                        ) % (dictPrelevements[track.IDfacture]["iban"],
                             dictPrelevements[track.IDfacture]["rum"],
                             dictPrelevements[track.IDfacture]["titulaire"],
                             dictPrelevements[
                                 track.IDfacture]["datePrelevement"])
                    else:
                        textePrelevement = _(
                            u"N° Compte : %s | Etab : %s | Guichet : %s | Clé : %s | Titulaire : %s"
                        ) % (track.prelevement_numero, track.prelevement_etab,
                             track.prelevement_guichet, track.prelevement_cle,
                             track.prelevement_payeur)
                else:
                    textePrelevement = u""

                if track.adresse_famille["rue"] != None:
                    rue = track.adresse_famille["rue"]
                else:
                    rue = u""
                if track.adresse_famille["cp"] != None:
                    cp = track.adresse_famille["cp"]
                else:
                    cp = u""
                if track.adresse_famille["ville"] != None:
                    ville = track.adresse_famille["ville"]
                else:
                    ville = u""

                dataTableau = []
                dataTableau.append(
                    (Paragraph(_(u"Famille"),
                               styleLabel), Paragraph(_(u"Adresse"),
                                                      styleLabel),
                     Paragraph(_(u"Prélèvement bancaire"), styleLabel)))
                dataTableau.append(
                    (Paragraph(track.nomsTitulaires,
                               styleTexte), (Paragraph(rue, styleTexte),
                                             Paragraph(u"%s %s" % (cp, ville),
                                                       styleTexte)),
                     Paragraph(textePrelevement, styleTexte)))

                largeursColonnes = [180, 140, largeurContenu - 320]
                tableau = Table(dataTableau, largeursColonnes)
                listeStyles = [
                    ('TOPPADDING', (0, 0), (-1, 0), 0),
                    ('BOTTOMPADDING', (0, 0), (-1, 0), -1),
                    ('FONT', (0, -1), (-1, -1), "Helvetica", 7),
                    ('GRID', (0, 0), (-1, 0), 0.25, colors.black),
                    ('BOX', (0, 1), (-1, 1), 0.25, colors.black),
                    ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
                    ('BACKGROUND', (0, 0), (-1, 0), couleurFond2),
                ]
                tableau.setStyle(TableStyle(listeStyles))
                story.append(tableau)

                # Récupération des champs personnalisés
                dataTableau = []

                label_1, label_2, label_3, question_1, question_2, question_3 = "", "", "", "", "", ""
                for dictReponse in self.Questionnaires.GetDonnees(
                        track.IDfamille):
                    if dictReponse["champ"] == dictOptions["question_1"]:
                        label_1, question_1 = dictReponse[
                            "label"], dictReponse["reponse"]
                    if dictReponse["champ"] == dictOptions["question_2"]:
                        label_2, question_2 = dictReponse[
                            "label"], dictReponse["reponse"]
                    if dictReponse["champ"] == dictOptions["question_3"]:
                        label_3, question_3 = dictReponse[
                            "label"], dictReponse["reponse"]

                if len(label_1) > 0 or len(label_2) > 0 or len(label_3) > 0:
                    dataTableau.append(
                        (Paragraph(label_1,
                                   styleLabel), Paragraph(label_2, styleLabel),
                         Paragraph(label_3, styleLabel)))
                    dataTableau.append((Paragraph(question_1, styleTexte),
                                        Paragraph(question_2, styleTexte),
                                        Paragraph(question_3, styleTexte)))
                    largeursColonnes = [
                        largeurContenu / 3.0, largeurContenu / 3.0,
                        largeurContenu / 3.0
                    ]
                    tableau = Table(dataTableau, largeursColonnes)
                    listeStyles = [
                        ('TOPPADDING', (0, 0), (-1, 0), 0),
                        ('BOTTOMPADDING', (0, 0), (-1, 0), -1),
                        ('FONT', (0, -1), (-1, -1), "Helvetica", 7),
                        ('GRID', (0, 0), (-1, 0), 0.25, colors.black),
                        ('BOX', (0, 1), (-1, 1), 0.25, colors.black),
                        ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
                        ('BACKGROUND', (0, 0), (-1, 0), couleurFond2),
                    ]
                    tableau.setStyle(TableStyle(listeStyles))
                    story.append(tableau)

                # Détail des prestations
                if dictOptions[
                        "type_document"] == 0 and track.IDfacture in dictPrestations:

                    # Préparation des champs individuels supplémentaires
                    liste_champs_ind = []
                    for key in ("champ_ind_1", "champ_ind_2", "champ_ind_3"):
                        if dictOptions[key] not in ("non", "", None):
                            liste_champs_ind.append(dictOptions[key])

                    if len(liste_champs_ind) == 0:
                        dataTableau = [
                            (Paragraph(_(u"Individu"), styleLabel),
                             Paragraph(_(u"Activité"), styleLabel),
                             Paragraph(_(u"Prestation"), styleLabel),
                             Paragraph(_(u"Quantité"), styleLabel),
                             Paragraph(_(u"Montant total"), styleLabel)),
                        ]
                        largeursColonnes = [130, 120, 185, 35, 50]
                    else:
                        # On rajoute la colonne Infos individuelles :
                        dataTableau = [
                            (Paragraph(_(u"Individu"), styleLabel),
                             Paragraph(_(u"Informations"), styleLabel),
                             Paragraph(_(u"Activité"), styleLabel),
                             Paragraph(_(u"Prestation"), styleLabel),
                             Paragraph(_(u"Quantité"), styleLabel),
                             Paragraph(_(u"Montant total"), styleLabel)),
                        ]
                        largeursColonnes = [120, 110, 100, 105, 35, 50]

                    for IDindividu, dictLabels in dictPrestations[
                            track.IDfacture].items():

                        if IDindividu in dictIndividus:
                            labelIndividu = dictIndividus[IDindividu]
                        else:
                            labelIndividu = u""

                        listeActivites = []
                        listeLabels = []
                        listeQuantites = []
                        listeMontants = []
                        for labelPrestation, dictTemp in dictLabels.items():

                            if dictTemp["IDactivite"] != None and dictTemp[
                                    "IDactivite"] in dictActivites:
                                labelActivite = dictActivites[
                                    dictTemp["IDactivite"]]
                            else:
                                labelActivite = u""

                            listeActivites.append(
                                Paragraph(labelActivite[:35], styleTexte2))
                            listeLabels.append(
                                Paragraph(labelPrestation[:40], styleTexte2))
                            listeQuantites.append(
                                Paragraph(str(dictTemp["quantite"]),
                                          styleTexte2))
                            listeMontants.append(
                                Paragraph(
                                    u"%.2f %s" %
                                    (dictTemp["montant"], SYMBOLE),
                                    styleMontant))

                        ligne = [
                            Paragraph(labelIndividu, styleTexte2),
                            listeActivites,
                            listeLabels,
                            listeQuantites,
                            listeMontants,
                        ]

                        # Récupération des infos individuelles
                        if len(liste_champs_ind) > 0:
                            liste_textes_ind = []
                            for key in liste_champs_ind:
                                # Ecole
                                if "ecole" in key or "classe" in key or "niveau" in key:
                                    if "date_debut" in key:
                                        date_reference = track.date_debut
                                    else:
                                        date_reference = track.date_fin
                                    infosIndividus = UTILS_Infos_individus.Informations(
                                        date_reference=date_reference,
                                        qf=False,
                                        inscriptions=False,
                                        messages=False,
                                        infosMedicales=False,
                                        cotisationsManquantes=False,
                                        piecesManquantes=False,
                                        questionnaires=False,
                                        scolarite=True)
                                    dictInfosIndividus = infosIndividus.GetDictValeurs(
                                        mode="individu",
                                        ID=IDindividu,
                                        formatChamp=False)
                                    texte = ""
                                    if "ecole" in key and "SCOLARITE_NOM_ECOLE" in dictInfosIndividus:
                                        texte = dictInfosIndividus[
                                            "SCOLARITE_NOM_ECOLE"]
                                    if "classe" in key and "SCOLARITE_NOM_CLASSE" in dictInfosIndividus:
                                        texte = dictInfosIndividus[
                                            "SCOLARITE_NOM_CLASSE"]
                                    if "niveau" in key and "SCOLARITE_NOM_NIVEAU" in dictInfosIndividus:
                                        texte = dictInfosIndividus[
                                            "SCOLARITE_NOM_NIVEAU"]
                                    liste_textes_ind.append(
                                        Paragraph(texte, styleTexte2))

                            ligne.insert(1, liste_textes_ind)

                        # Insertion de la ligne dans le tableau
                        dataTableau.append(ligne)

                    tableau = Table(dataTableau, largeursColonnes)
                    listeStyles = [
                        ('TOPPADDING', (0, 0), (-1, 0), 0),
                        ('BOTTOMPADDING', (0, 0), (-1, 0), -1),
                        ('FONT', (0, -1), (-1, -1), "Helvetica", 7),
                        ('GRID', (0, 0), (-1, -1), 0.25, colors.black),
                        ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
                        ('BACKGROUND', (0, 0), (-1, 0), couleurFond2),
                    ]
                    tableau.setStyle(TableStyle(listeStyles))
                    story.append(tableau)

                story.append(Spacer(0, 10))

        # Totaux
        dataTableau = [
            (_(u"Totaux par activités et prestations"), "", "", ""),
            (Paragraph(_(u"Activités"),
                       styleLabel), Paragraph(_(u"Prestations"), styleLabel),
             Paragraph(_(u"Quantité"),
                       styleLabel), Paragraph(_(u"Montant"), styleLabel)),
        ]
        largeursColonnes = [195, 240, 35, 50]

        for IDactivite, dictLabels in dictTotaux.items():

            if IDactivite == None:
                nomActivite = _(u"Prestations diverses")
            else:
                nomActivite = dictActivites[IDactivite]

            listeLabels = []
            listeQuantites = []
            listeMontants = []
            quantiteActivite = 0
            totalActivite = 0.0
            for label, dictTemp in dictLabels.items():
                listeLabels.append(Paragraph(label, styleTexte2))
                listeQuantites.append(
                    Paragraph(str(dictTemp["quantite"]), styleTexte2))
                listeMontants.append(
                    Paragraph(u"%.2f %s" % (dictTemp["montant"], SYMBOLE),
                              styleMontant))
                quantiteActivite += dictTemp["quantite"]
                totalActivite += dictTemp["montant"]

            listeLabels.append(
                Paragraph(_(u"<b><i>Total de l'activité</i></b>"),
                          styleTexte2))
            listeQuantites.append(
                Paragraph("<b><i>%d</i></b>" % quantiteActivite, styleTexte2))
            listeMontants.append(
                Paragraph(u"<b><i>%.2f %s</i></b>" % (totalActivite, SYMBOLE),
                          styleMontant))

            dataTableau.append((
                Paragraph(nomActivite, styleTexte2),
                listeLabels,
                listeQuantites,
                listeMontants,
            ))

        tableau = Table(dataTableau, largeursColonnes)
        listeStyles = [
            ('TOPPADDING', (0, 1), (-1, 1), 0),
            ('BOTTOMPADDING', (0, 1), (-1, 1), -1),
            ('FONT', (1, -1), (-1, -1), "Helvetica", 7),
            ('FONT', (0, 0), (0, 0), "Helvetica-Bold", 7),
            ('BOX', (0, 0), (-1, 0), 0.25, colors.black),
            ('GRID', (0, 1), (-1, -1), 0.25, colors.black),
            ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
            ('BACKGROUND', (0, 0), (-1, 0), couleurFond1),
            ('BACKGROUND', (0, 1), (-1, 1), couleurFond2),
        ]
        tableau.setStyle(TableStyle(listeStyles))
        story.append(tableau)

        story.append(Spacer(0, 10))

        # Texte de conclusion
        conclusion_texte = dictOptions["conclusion_texte"]
        conclusion_texte = conclusion_texte.replace("{NBRE_FACTURES}",
                                                    str(len(self.tracks)))
        conclusion_texte = conclusion_texte.replace(
            "{TOTAL_FACTURES}", u"%.2f %s" % (montantTotal, SYMBOLE))
        conclusion_texte = conclusion_texte.replace("{NBRE_FACT_PRELEV}",
                                                    str(nbrFactPrelev))
        conclusion_texte = conclusion_texte.replace(
            "{TOTAL_FACT_PRELEV}", u"%.2f %s" % (montantTotalPrelev, SYMBOLE))
        story.append(Paragraph(conclusion_texte, styleConclusion))

        # Enregistrement et ouverture du PDF
        try:
            doc.build(story)
        except Exception as err:
            print("Erreur dans ouverture PDF :", err)
            if "Permission denied" in err:
                dlg = wx.MessageDialog(
                    None,
                    _(u"Noethys ne peut pas créer le PDF.\n\nVeuillez vérifier qu'un autre PDF n'est pas déjà ouvert en arrière-plan..."
                      ), _(u"Erreur d'édition"), wx.OK | wx.ICON_ERROR)
                dlg.ShowModal()
                dlg.Destroy()
                return False

        FonctionsPerso.LanceFichierExterne(nomDoc)
Esempio n. 3
0
    def Imprimer(self, event=None):
        # Création du PDF
        from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle
        from reportlab.lib.pagesizes import A4
        from reportlab.lib import colors
        from reportlab.lib.styles import ParagraphStyle

        hauteur_page = A4[1]
        largeur_page = A4[0]

        # Initialisation du PDF
        nomDoc = FonctionsPerso.GenerationNomDoc("EVENEMENTS", "pdf")
        if sys.platform.startswith("win"): nomDoc = nomDoc.replace("/", "\\")
        doc = SimpleDocTemplate(nomDoc,
                                pagesize=(largeur_page, hauteur_page),
                                topMargin=30,
                                bottomMargin=30,
                                leftMargin=40,
                                rightMargin=40)
        story = []

        # Création du titre du document
        dataTableau = []
        largeursColonnes = ((largeur_page - 175, 100))
        dateDuJour = UTILS_Dates.DateEngFr(str(datetime.date.today()))
        dataTableau.append((_(u"Evènements"), _(u"%s\nEdité le %s") %
                            (UTILS_Organisateur.GetNom(), dateDuJour)))
        style = TableStyle([
            ('BOX', (0, 0), (-1, -1), 0.25, colors.black),
            ('VALIGN', (0, 0), (-1, -1), 'TOP'),
            ('ALIGN', (0, 0), (0, 0), 'LEFT'),
            ('FONT', (0, 0), (0, 0), "Helvetica-Bold", 16),
            ('ALIGN', (1, 0), (1, 0), 'RIGHT'),
            ('FONT', (1, 0), (1, 0), "Helvetica", 6),
        ])
        tableau = Table(dataTableau, largeursColonnes)
        tableau.setStyle(style)
        story.append(tableau)
        story.append(Spacer(0, 10))

        # Intro
        styleA = ParagraphStyle(name="A",
                                fontName="Helvetica",
                                fontSize=6,
                                spaceAfter=20)
        #story.append(Paragraph(self.labelParametres, styleA))

        # Tableau
        dataTableau = []
        largeurColonnesSuivantes = 70
        largeurColonne1 = largeur_page - 80 - 1.0 * (
            len(self.dictImpression["entete"]) - 1) * largeurColonnesSuivantes
        largeursColonnes = [
            largeurColonne1,
        ]
        for x in range(0, len(self.dictImpression["entete"]) - 1):
            largeursColonnes.append(largeurColonnesSuivantes)

        # Entetes labels
        dataTableau.append(self.dictImpression["entete"])

        # Contenu du tableau
        listeRubriques = ("contenu", "total")
        for rubrique in listeRubriques:
            listeLignes = self.dictImpression[rubrique]

            for ligne in listeLignes:
                dataTableau.append(ligne)

        positionLigneTotal = len(self.dictImpression["contenu"]) + 1
        listeStyles = [
            ('VALIGN', (0, 0), (-1, -1),
             'MIDDLE'),  # Centre verticalement toutes les cases
            ('FONT', (0, 0), (-1, -1), "Helvetica",
             7),  # Donne la police de caract. + taille de police
            ('GRID', (0, 0), (-1, -1), 0.25,
             colors.black),  # Crée la bordure noire pour tout le tableau
            ('ALIGN', (1, 0), (-1, -1), 'CENTRE'),  # Centre les cases
            ('BACKGROUND', (0, 0), (-1, 0),
             (0.6, 0.6, 0.6)),  # Donne la couleur de fond du label
            ('BACKGROUND', (0, positionLigneTotal), (-1, positionLigneTotal),
             (0.8, 0.8, 0.8)),  # Donne la couleur de fond du total
        ]

        # Formatage des lignes "Activités"
        for indexColoration, typeColoration in self.dictImpression[
                "coloration"]:

            if typeColoration == "activite":
                listeStyles.append(
                    ('FONT', (0, indexColoration + 1),
                     (-1, indexColoration + 1), "Helvetica-Bold", 7))
                listeStyles.append(
                    ('BACKGROUND', (0, indexColoration + 1),
                     (-1, indexColoration + 1), (0.91, 0.91, 0.91)))

            if typeColoration == "regroup":
                listeStyles.append(
                    ('FONT', (0, indexColoration + 1),
                     (-1, indexColoration + 1), "Helvetica-Bold", 7))
                listeStyles.append(('TEXTCOLOR', (0, indexColoration + 1),
                                    (-1, indexColoration + 1), (1, 1, 1)))
                listeStyles.append(('BACKGROUND', (0, indexColoration + 1),
                                    (-1, indexColoration + 1), (0, 0, 0)))

        # Création du tableau
        tableau = Table(dataTableau, largeursColonnes, repeatRows=1)
        tableau.setStyle(TableStyle(listeStyles))
        story.append(tableau)
        story.append(Spacer(0, 20))

        # Enregistrement du PDF
        doc.build(story)

        # Affichage du PDF
        FonctionsPerso.LanceFichierExterne(nomDoc)
Esempio n. 4
0
                observations) > 0:
            style_observations = ParagraphStyle(
                name="2",
                alignment=1,
                fontName="Helvetica",
                fontSize=dictOptions["taille_texte"],
                leading=8,
                spaceBefore=10)
            story.append(Paragraph(observations, style=style_observations))

        # Enregistrement du PDF
        doc.build(story)

        # Affichage du PDF
        if afficherDoc == True:
            FonctionsPerso.LanceFichierExterne(nomDoc)

        # Mémorisation des champs de fusion
        dictChampsFusion["{NOM_COMMANDE}"] = nom_commande
        dictChampsFusion["{DATE_DEBUT}"] = UTILS_Dates.DateDDEnFr(date_debut)
        dictChampsFusion["{DATE_FIN}"] = UTILS_Dates.DateDDEnFr(date_fin)

        return dictChampsFusion


class CTRL_Options_impression(DLG_Options_impression_pdf.CTRL_Parametres):
    def __init__(self, parent):
        DLG_Options_impression_pdf.CTRL_Parametres.__init__(self, parent)

    def Remplissage(self):
        # Affichage
Esempio n. 5
0
    def ExportExcel(self, event=None):
        """ Export Excel """
        titre = _(u"Inscriptions")

        # Demande à l'utilisateur le nom de fichier et le répertoire de destination
        nomFichier = "ExportExcel_%s.xls" % datetime.datetime.now().strftime("%Y%m%d%H%M%S")
        wildcard = "Fichier Excel (*.xls)|*.xls|" \
                        "All files (*.*)|*.*"
        sp = wx.StandardPaths.Get()
        cheminDefaut = sp.GetDocumentsDir()
        dlg = wx.FileDialog(
            None, message = _(u"Veuillez sélectionner le répertoire de destination et le nom du fichier"), defaultDir=cheminDefaut,
            defaultFile = nomFichier,
            wildcard = wildcard,
            style = wx.SAVE
            )
        dlg.SetFilterIndex(0)
        if dlg.ShowModal() == wx.ID_OK:
            cheminFichier = dlg.GetPath()
            dlg.Destroy()
        else:
            dlg.Destroy()
            return

        # Le fichier de destination existe déjà :
        if os.path.isfile(cheminFichier) == True :
            dlg = wx.MessageDialog(None, _(u"Un fichier portant ce nom existe déjà. \n\nVoulez-vous le remplacer ?"), "Attention !", wx.YES_NO | wx.NO_DEFAULT | wx.ICON_EXCLAMATION)
            if dlg.ShowModal() == wx.ID_NO :
                return False
                dlg.Destroy()
            else:
                dlg.Destroy()

        # Export
        import pyExcelerator
        # Création d'un classeur
        wb = pyExcelerator.Workbook()
        # Création d'une feuille
        ws1 = wb.add_sheet(titre)
        # Remplissage de la feuille

        fntLabel = pyExcelerator.Font()
        fntLabel.name = 'Verdana'
        fntLabel.bold = True

        al = pyExcelerator.Alignment()
        al.horz = pyExcelerator.Alignment.HORZ_LEFT
        al.vert = pyExcelerator.Alignment.VERT_CENTER

        ar = pyExcelerator.Alignment()
        ar.horz = pyExcelerator.Alignment.HORZ_RIGHT
        ar.vert = pyExcelerator.Alignment.VERT_CENTER

        pat = pyExcelerator.Pattern()
        pat.pattern = pyExcelerator.Pattern.SOLID_PATTERN
        pat.pattern_fore_colour = 0x01F

        styleLabel = pyExcelerator.XFStyle()
        styleLabel.alignment = al
        styleLabel.pattern = pat

        styleTotal = pyExcelerator.XFStyle()
        styleTotal.alignment = al
        styleTotal.pattern = pat
        styleTotal.font.bold = True

        styleTotalNbre = pyExcelerator.XFStyle()
        styleTotalNbre.alignment = ar
        styleTotalNbre.pattern = pat
        styleTotalNbre.font.bold = True

        styleEuros = pyExcelerator.XFStyle()
        styleEuros.num_format_str = '"$"#,##0.00_);("$"#,##'
        styleEuros.alignment = ar

        styleTotalEuros = pyExcelerator.XFStyle()
        styleTotalEuros.num_format_str = '"$"#,##0.00_);("$"#,##'
        styleTotalEuros.alignment = ar
        styleTotalEuros.pattern = pat
        styleTotalEuros.font.bold = True

        # Création des labels de colonnes
        x = 0
        y = 0
        for valeur in self.dictImpression["entete"] :
            ws1.write(x, y, valeur)
            ws1.col(y).width = 3000
            y += 1
        ws1.col(0).width = 10000

        def RechercheFormat(valeur, titre):
            """ Recherche si la valeur est un nombre """
            format = None
            # Si c'est un nombre
            try :
                nbre = float(valeur)
                if titre == True :
                    format = styleTotalNbre
                return (nbre, format)
            except :
                pass

            return False, None


        # Contenu
        x = 1
        y = 0
        for ligne in self.dictImpression["contenu"] :
            for valeur in ligne :

                # Recherche si c'est un titre
                if x-1 in self.dictImpression["coloration"] :
                    titre = True
                else:
                    titre = False

                # Recherche s'il y a un format de nombre ou de montant
                nbre, format = RechercheFormat(valeur, titre)
                if nbre != False :
                    valeur = nbre

                if nbre == False and titre == True and format == None :
                    format = styleTotal

                # Enregistre la valeur
                if format != None :
                    ws1.write(x, y, valeur, format)
                else:
                    ws1.write(x, y, valeur)

                y += 1
            x += 1
            y = 0

        # Total
        premiereLigne = True
        for ligne in self.dictImpression["total"] :
            for valeur in ligne :

                # Recherche si c'est un titre
                if premiereLigne == True :
                    titre = True
                else:
                    titre = False

                # Recherche s'il y a un format de nombre ou de montant
                nbre, format = RechercheFormat(valeur, titre)
                if nbre != False :
                    valeur = nbre

                if nbre == False and titre == True and format == None :
                    format = styleTotal

                # Enregistre la valeur
                if format != None :
                    ws1.write(x, y, valeur, format)
                else:
                    ws1.write(x, y, valeur)

                y += 1
            premiereLigne = False
            x += 1
            y = 0

        # Finalisation du fichier xls
        wb.save(cheminFichier)

        # Confirmation de création du fichier et demande d'ouverture directe dans Excel
        txtMessage = _(u"Le fichier Excel a été créé avec succès. Souhaitez-vous l'ouvrir dès maintenant ?")
        dlgConfirm = wx.MessageDialog(None, txtMessage, _(u"Confirmation"), wx.YES_NO|wx.NO_DEFAULT|wx.ICON_QUESTION)
        reponse = dlgConfirm.ShowModal()
        dlgConfirm.Destroy()
        if reponse == wx.ID_NO:
            return
        else:
            FonctionsPerso.LanceFichierExterne(cheminFichier)
class Impression():
    def __init__(self,
                 dictValeurs={},
                 IDmodele=None,
                 nomDoc=FonctionsPerso.GenerationNomDoc(
                     "RECU_REGLEMENT", "pdf"),
                 afficherDoc=True):
        """ Impression """
        global DICT_VALEURS
        DICT_VALEURS = dictValeurs

        # Initialisation du document
        doc = BaseDocTemplate(nomDoc, pagesize=TAILLE_PAGE, showBoundary=False)

        # Mémorise le ID du modèle
        modeleDoc = DLG_Noedoc.ModeleDoc(IDmodele=IDmodele)
        doc.modeleDoc = modeleDoc

        # Vérifie qu'un cadre principal existe bien dans le document
        if doc.modeleDoc.FindObjet("cadre_principal") == None:
            raise Exception(
                "Votre modele de document doit obligatoirement comporter un cadre principal. Retournez dans l'editeur de document et utilisez pour votre modele la commande 'Inserer un objet special > Inserer le cadre principal'."
            )

        # Mémorise le ID du modèle
        modeleDoc = DLG_Noedoc.ModeleDoc(IDmodele=IDmodele)
        doc.modeleDoc = modeleDoc

        doc.addPageTemplates(MyPageTemplate(pageSize=TAILLE_PAGE, doc=doc))

        story = []
        styleSheet = getSampleStyleSheet()
        h3 = styleSheet['Heading3']
        styleTexte = styleSheet['BodyText']
        styleTexte.fontName = "Helvetica"
        styleTexte.fontSize = 9
        styleTexte.borderPadding = 9
        styleTexte.leading = 12

        ##        # Définit le template des pages suivantes
        ##        story.append(NextPageTemplate("suivante"))

        # ----------- Insertion du contenu des frames --------------

        # ------------------- TITRE -----------------
        dataTableau = []
        largeursColonnes = [
            TAILLE_CADRE_CONTENU[2],
        ]
        dataTableau.append((_(u"Reçu de règlement"), ))
        dataTableau.append((u"", ))
        style = TableStyle([
            ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
            ('FONT', (0, 0), (0, 0), "Helvetica-Bold", 19),
            ('FONT', (0, 1), (0, 1), "Helvetica", 8),
            ('LINEBELOW', (0, 0), (0, 0), 0.25, colors.black),
            ('ALIGN', (0, 0), (-1, -1), 'LEFT'),
        ])
        tableau = Table(dataTableau, largeursColonnes)
        tableau.setStyle(style)
        story.append(tableau)
        story.append(Spacer(0, 10))

        # TEXTE D'INTRODUCTION
        paraStyleIntro = ParagraphStyle(
            name="intro",
            fontName="Helvetica",
            fontSize=11,
            leading=14,
            spaceBefore=0,
            spaceafter=0,
            leftIndent=0,
            rightIndent=0,
            alignment=0,
        )

        if DICT_VALEURS["intro"] != None:
            texteIntro = DICT_VALEURS["intro"]
            story.append(Paragraph(u"<i>%s</i>" % texteIntro, paraStyleIntro))
            story.append(Spacer(0, 20))

        couleurFond = (0.8, 0.8, 1)

        # ------------------- TABLEAU CONTENU -----------------

        dataTableau = []
        largeursColonnes = [120, 280]

        paraStyle = ParagraphStyle(
            name="detail",
            fontName="Helvetica-Bold",
            fontSize=9,
        )
        dataTableau.append((_(u"Caractéristiques du règlement"), ""))
        montantEnLettres = UTILS_Conversion.trad(DICT_VALEURS["montant"],
                                                 MONNAIE_SINGULIER,
                                                 MONNAIE_DIVISION).strip()
        dataTableau.append((_(u"Montant du règlement :"),
                            Paragraph(montantEnLettres.capitalize(),
                                      paraStyle)))
        dataTableau.append((_(u"Mode de règlement :"),
                            Paragraph(DICT_VALEURS["nomMode"], paraStyle)))
        dataTableau.append((_(u"Nom du payeur :"),
                            Paragraph(DICT_VALEURS["nomPayeur"], paraStyle)))
        if DICT_VALEURS["nomEmetteur"] != None:
            dataTableau.append((_(u"Nom de l'émetteur :"),
                                Paragraph(DICT_VALEURS["nomEmetteur"],
                                          paraStyle)))
        if DICT_VALEURS["numPiece"] not in ("", None):
            dataTableau.append((_(u"Numéro de pièce :"),
                                Paragraph(DICT_VALEURS["numPiece"],
                                          paraStyle)))

        style = TableStyle([
            ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
            ('FONT', (0, 0), (0, -1), "Helvetica", 9),
            ('FONT', (1, 0), (1, -1), "Helvetica-Bold", 9),
            ('GRID', (0, 0), (-1, -1), 0.25, colors.black),
            ('ALIGN', (0, 1), (0, -1), 'RIGHT'),
            ('ALIGN', (1, 1), (1, -1), 'LEFT'),
            ('FONT', (0, 0), (0, 0), "Helvetica", 7),
            ('SPAN', (0, 0), (-1, 0)),
            ('BACKGROUND', (0, 0), (-1, 0), couleurFond),
        ])
        tableau = Table(dataTableau, largeursColonnes)
        tableau.setStyle(style)
        story.append(tableau)

        # --------------------- LISTE DES PRESTATIONS ----------------
        listePrestations = dictValeurs["prestations"]
        if len(listePrestations) > 0:

            story.append(Spacer(0, 20))
            textePrestations = _(u"En paiement des prestations suivantes :")
            story.append(
                Paragraph(u"<i>%s</i>" % textePrestations, paraStyleIntro))
            story.append(Spacer(0, 20))

            dataTableau = [
                (_(u"Date"), _(u"Activité"), _(u"Individu"), _(u"Intitulé"),
                 _(u"Part utilisée")),
            ]
            largeursColonnes = [50, 95, 70, 135, 50]

            paraStyle = ParagraphStyle(
                name="detail",
                fontName="Helvetica",
                fontSize=7,
                leading=7,
                spaceBefore=0,
                spaceAfter=0,
            )

            for dictPrestation in listePrestations:
                date = UTILS_Dates.DateDDEnFr(dictPrestation["date"])
                activite = dictPrestation["nomActivite"]
                individu = dictPrestation["prenomIndividu"]
                label = dictPrestation["label"]
                montant = dictPrestation["montant"]
                ventilation = dictPrestation["ventilation"]

                dataTableau.append((
                    Paragraph(u"<para align='center'>%s</para>" % date,
                              paraStyle),
                    Paragraph(activite, paraStyle),
                    Paragraph(individu, paraStyle),
                    Paragraph(label, paraStyle),
                    Paragraph(
                        u"<para align='right'>%.2f %s</para>" %
                        (ventilation, SYMBOLE), paraStyle),
                ))

            style = TableStyle([
                ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
                ('GRID', (0, 0), (-1, -1), 0.25, colors.black),
                ('FONT', (0, 0), (-1, -1), "Helvetica", 7),
                ('TOPPADDING', (0, 1), (-1, -1), 1),
                ('BOTTOMPADDING', (0, 1), (-1, -1), 3),

                # Ligne Entetes
                ('FONT', (0, 0), (-1, 0), "Helvetica", 7),
                ('BACKGROUND', (0, 0), (-1, 0), couleurFond),
                ('ALIGN', (0, 0), (-1, 0), 'CENTER'),
            ])
            tableau = Table(dataTableau, largeursColonnes)
            tableau.setStyle(style)
            story.append(tableau)

        # Enregistrement et ouverture du PDF
        try:
            doc.build(story)
        except Exception, err:
            print "Erreur dans ouverture PDF :", err
            if "Permission denied" in err:
                dlg = wx.MessageDialog(
                    None,
                    _(u"Noethys ne peut pas créer le PDF.\n\nVeuillez vérifier qu'un autre PDF n'est pas déjà ouvert en arrière-plan..."
                      ), _(u"Erreur d'édition"), wx.OK | wx.ICON_ERROR)
                dlg.ShowModal()
                dlg.Destroy()
                return

        if afficherDoc == True:
            FonctionsPerso.LanceFichierExterne(nomDoc)
Esempio n. 7
0
def ExportExcel(listview=None, grid=None, titre=_(u"Liste"), listeColonnes=None, listeValeurs=None, autoriseSelections=True):
    """ Export de la liste au format Excel """
    # Plus de sélection pour éviter les bugs !!!!
    autoriseSelections = False 
    
    # Vérifie si données bien présentes
    if (listview != None and len(listview.donnees) == 0) or (grid != None and (grid.GetNumberRows() == 0 or grid.GetNumberCols() == 0)):
        dlg = wx.MessageDialog(None, _(u"Il n'y a aucune donnée dans la liste !"), "Erreur", wx.OK | wx.ICON_ERROR)
        dlg.ShowModal()
        dlg.Destroy()
        return
        
    # Récupération des valeurs
    if listview != None and listeColonnes == None and listeValeurs == None :
        listeColonnes, listeValeurs = GetValeursListview(listview, format="original")
        
    if grid != None and listeColonnes == None and listeValeurs == None :
        autoriseSelections = False
        listeColonnes, listeValeurs = GetValeursGrid(grid)
    
    # Selection des lignes
    if autoriseSelections == True :
        dlg = DLG_Selection_liste.Dialog(None, listeColonnes, listeValeurs, type="exportExcel")
        if dlg.ShowModal() == wx.ID_OK:
            listeSelections = dlg.GetSelections()
            dlg.Destroy()
        else:
            dlg.Destroy()
            return False

    # Choix Action
    dlg = DLG_Choix_action(None)
    reponse = dlg.ShowModal()
    dlg.Destroy()
    if reponse == 100 :
        mode = "enregistrer"
    elif reponse == 200 :
        mode = "email"
    else :
        return

    # Définit le nom et le chemin du fichier
    nomFichier = "ExportExcel_%s.xls" % datetime.datetime.now().strftime("%Y%m%d%H%M%S")

    # Mode Enregistrer
    if mode == "enregistrer" :

        # Demande à l'utilisateur le nom de fichier et le répertoire de destination
        wildcard = "Fichier Excel (*.xls)|*.xls|" \
                        "All files (*.*)|*.*"
        sp = wx.StandardPaths.Get()
        cheminDefaut = sp.GetDocumentsDir()
        dlg = wx.FileDialog(
            None, message = _(u"Veuillez sélectionner le répertoire de destination et le nom du fichier"), defaultDir=cheminDefaut,
            defaultFile = nomFichier,
            wildcard = wildcard,
            style = wx.SAVE
            )
        dlg.SetFilterIndex(0)
        if dlg.ShowModal() == wx.ID_OK:
            cheminFichier = dlg.GetPath()
            dlg.Destroy()
        else:
            dlg.Destroy()
            return

        # Le fichier de destination existe déjà :
        if os.path.isfile(cheminFichier) == True :
            dlg = wx.MessageDialog(None, _(u"Un fichier portant ce nom existe déjà. \n\nVoulez-vous le remplacer ?"), "Attention !", wx.YES_NO | wx.NO_DEFAULT | wx.ICON_EXCLAMATION)
            if dlg.ShowModal() == wx.ID_NO :
                return False
                dlg.Destroy()
            else:
                dlg.Destroy()

    # Mode Envoyer par Email
    if mode == "email" :
        cheminFichier = UTILS_Fichiers.GetRepTemp(fichier=nomFichier)


    # Export
    import pyExcelerator
    # Création d'un classeur
    wb = pyExcelerator.Workbook()
    # Création d'une feuille
    ws1 = wb.add_sheet(titre)
    # Remplissage de la feuille

    al = pyExcelerator.Alignment()
    al.horz = pyExcelerator.Alignment.HORZ_LEFT
    al.vert = pyExcelerator.Alignment.VERT_CENTER
    
    ar = pyExcelerator.Alignment()
    ar.horz = pyExcelerator.Alignment.HORZ_RIGHT
    ar.vert = pyExcelerator.Alignment.VERT_CENTER

    styleEuros = pyExcelerator.XFStyle()
    styleEuros.num_format_str = '"$"#,##0.00_);("$"#,##'
    styleEuros.alignment = ar

    styleDate = pyExcelerator.XFStyle()
    styleDate.num_format_str = 'DD/MM/YYYY'
    styleDate.alignment = ar

    styleHeure = pyExcelerator.XFStyle()
    styleHeure.num_format_str = "[hh]:mm"
    styleHeure.alignment = ar

    # Création des labels de colonnes
    x = 0
    y = 0
    for labelCol, alignement, largeur, nomChamp in listeColonnes :
        try :
            if "CheckState" in unicode(nomChamp) :
                nomChamp = "Coche"
        except :
            pass
        ws1.write(x, y, labelCol)
        ws1.col(y).width = largeur*42
        y += 1

    # -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    # Création des lignes
    def RechercheFormatFromChaine(valeur):
        """ Recherche le type de la chaîne """
        if valeur.endswith(SYMBOLE) :
            # Si c'est un montant en euros
            try :
                if valeur.startswith("- ") :
                    valeur = valeur.replace("- ", "-")
                if valeur.startswith("+ ") :
                    valeur = valeur.replace("+ ", "")
                nbre = float(valeur[:-1]) 
                return (nbre, styleEuros)
            except :
                pass
                
        # Si c'est un nombre
        try :
            if valeur.startswith("- ") :
                valeur = valeur.replace("- ", "-")
            nbre = float(valeur)
            return (nbre, None)
        except :
            pass
        
        # Si c'est une date
        try :
            if len(valeur) == 10 :
                if valeur[2] == "/" and valeur[5] == "/" :
                    return (valeur, styleDate)
        except :
            pass

        if type(valeur) == datetime.timedelta :
            return (valeur, styleHeure)

        # Si c'est une heure
        try :
            if len(valeur) > 3 :
                if ":" in valeur :
                    separateur = ":"
                elif "h" in valeur :
                    separateur = "h"
                else :
                    separateur = None
                if separateur != None :
                    heures, minutes = valeur.split(separateur)
                    valeur = datetime.timedelta(minutes= int(heures)*60 + int(minutes))
                    # valeur = datetime.time(hour=int(valeur.split(separateur)[0]), minute=int(valeur.split(separateur)[1]))
                    return (valeur, styleHeure)
        except :
            pass

        return unicode(valeur), None

    # -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    def RechercheFormat(valeur):
        """ Recherche le type de la donnée """
        if type(valeur) == decimal.Decimal :
            valeur = float(valeur)
            return (valeur, styleEuros)
                
        if type(valeur) == float :
            return (valeur, None)
                
        if type(valeur) == int :
            return (valeur, None)
        
        if type(valeur) == datetime.date :
            valeur = UTILS_Dates.DateDDEnFr(valeur)
            return (valeur, styleDate)

        if type(valeur) == datetime.timedelta :
            return (valeur, styleHeure)

        try :
            if len(valeur) > 3 :
                if ":" in valeur :
                    separateur = ":"
                elif "h" in valeur :
                    separateur = "h"
                else :
                    separateur = None
                if separateur != None :
                    donnees = valeur.split(separateur)
                    if len(donnees) == 2 :
                        heures, minutes = donnees
                    if len(donnees) == 3 :
                        heures, minutes, secondes = donnees
                    valeur = datetime.timedelta(minutes= int(heures)*60 + int(minutes))
                    # valeur = datetime.time(hour=int(valeur.split(separateur)[0]), minute=int(valeur.split(separateur)[1]))
                    return (valeur, styleHeure)
        except :
            pass

        if type(valeur) in (str, unicode) :
            if len(valeur) == 10 :
                if valeur[2] == "/" and valeur[5] == "/" : return (valeur, styleDate)
                if valeur[4] == "-" and valeur[7] == "-" : return (UTILS_Dates.DateEngFr(valeur), styleDate)
                
        return unicode(valeur), None

    # -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    x = 1
    y = 0
    for valeurs in listeValeurs :
        if autoriseSelections == False or int(valeurs[0]) in listeSelections :
            for valeur in valeurs :
                if valeur == None :
                    valeur = u""
                    
                # Recherche s'il y a un format de nombre ou de montant
                if listview != None :
                    valeur, format = RechercheFormat(valeur) #RechercheFormatFromChaine(valeur)
                else :
                    valeur, format = RechercheFormatFromChaine(valeur)
                        
                # Enregistre la valeur
                if format != None :
                    ws1.write(x, y, valeur, format)
                else:
                    ws1.write(x, y, valeur)

                y += 1
            x += 1
            y = 0
            
    # Finalisation du fichier xls
    try :
        wb.save(cheminFichier)
    except :
        dlg = wx.MessageDialog(None, _(u"Il est impossible d'enregistrer le fichier Excel. Veuillez vérifier que ce fichier n'est pas déjà ouvert en arrière-plan."), "Erreur", wx.OK | wx.ICON_ERROR)
        dlg.ShowModal()
        dlg.Destroy()
        return

    # Confirmation de création du fichier et demande d'ouverture directe dans Excel
    if mode == "enregistrer" :
        txtMessage = _(u"Le fichier Excel a été créé avec succès. Souhaitez-vous l'ouvrir dès maintenant ?")
        dlgConfirm = wx.MessageDialog(None, txtMessage, _(u"Confirmation"), wx.YES_NO|wx.NO_DEFAULT|wx.ICON_QUESTION)
        reponse = dlgConfirm.ShowModal()
        dlgConfirm.Destroy()
        if reponse == wx.ID_NO:
            return
        else:
            FonctionsPerso.LanceFichierExterne(cheminFichier)

    # Envoyer par Email
    if mode == "email" :
        from Dlg import DLG_Mailer
        dlg = DLG_Mailer.Dialog(None)
        dlg.ChargerModeleDefaut()
        dlg.SetPiecesJointes([cheminFichier,])
        dlg.ShowModal()
        dlg.Destroy()
Esempio n. 8
0
    def OnBoutonFichier(self, event):
        if self.ValidationSaisie() == False:
            return

        # Récupération des paramètres
        tracks = self.ctrl_factures.GetTracksCoches()
        date_emission = self.ctrl_date.GetDate()
        code_col = self.ctrl_code_coll.GetValue()
        code_nat = self.ctrl_code_nat.GetValue()
        code_rec = self.ctrl_code_rec.GetValue()
        exercice = self.ctrl_exercice.GetValue()
        num_role = self.ctrl_num_role.GetValue()

        listeLignes = []
        for track in tracks:

            if track.prelevement == True:
                prelevement = True
                prelevement_etab = track.prelevement_etab
                prelevement_guichet = track.prelevement_guichet
                prelevement_compte = track.prelevement_numero
                prelevement_cle = track.prelevement_cle
                prelevement_titulaire = track.prelevement_payeur
            else:
                prelevement = False
                prelevement_etab = ""
                prelevement_guichet = ""
                prelevement_compte = ""
                prelevement_cle = ""
                prelevement_titulaire = ""

            if track.adresse_famille["rue"] != None:
                rue = track.adresse_famille["rue"]
            else:
                rue = u""
            if track.adresse_famille["cp"] != None:
                cp = track.adresse_famille["cp"]
            else:
                cp = u""
            if track.adresse_famille["ville"] != None:
                ville = track.adresse_famille["ville"]
            else:
                ville = u""

            dictDonnees = {
                "ROLCOL": code_col,  # Code Collectivité
                "ROLNAT": code_nat,  # Nature du rôle
                "ROLEX": exercice,  # Exercice
                "ROLREC": code_rec,  # Code Recette
                "ROLROL": num_role,  # Numéro de rôle
                "date_edition": date_emission,  # Date d'édition
                "ROLDET": track.numero,  # Numéro de dette
                "ROLEAU":
                int(str(FloatToDecimal(-track.solde)).replace(
                    ".", "")),  # Montant de la facture en centimes
                "nom": track.nomsTitulaires,  # Nom du débiteur
                "rue": rue,  # Rue de résidence du débiteur
                "code_postal":
                cp,  # Code postal de la ville de résidence du débiteur
                "ville": ville,  # Nom de la ville de résidence du débiteur
                "objet": _(u"Facture n°%s") %
                track.numero,  # Objet de la recette (64 caract max)
                "prelevement": prelevement,  # Activation du prélèvement
                "prelevement_etab": prelevement_etab,  # Code établissement
                "prelevement_guichet": prelevement_guichet,  # Code Guichet
                "prelevement_compte": prelevement_compte,  # Numéro de compte
                "prelevement_cle": prelevement_cle,  # Clé RIB
                "prelevement_titulaire":
                prelevement_titulaire,  # Nom titulaire du compte
            }

            ligne = UTILS_Helios.GetLigne(dictDonnees)
            listeLignes.append(ligne)

        # Finalisation du texte
        texte = "".join(listeLignes)

        # Demande à l'utilisateur le nom de fichier et le répertoire de destination
        nomFichier = "Rolmre.txt"
        wildcard = "Fichier texte (*.txt)|*.txt|" \
                        "All files (*.*)|*.*"
        sp = wx.StandardPaths.Get()
        cheminDefaut = sp.GetDocumentsDir()
        dlg = wx.FileDialog(
            None,
            message=
            _(u"Veuillez sélectionner le répertoire de destination et le nom du fichier"
              ),
            defaultDir=cheminDefaut,
            defaultFile=nomFichier,
            wildcard=wildcard,
            style=wx.FD_SAVE)
        dlg.SetFilterIndex(0)
        if dlg.ShowModal() == wx.ID_OK:
            cheminFichier = dlg.GetPath()
            dlg.Destroy()
        else:
            dlg.Destroy()
            return

        # Le fichier de destination existe déjà :
        if os.path.isfile(cheminFichier) == True:
            dlg = wx.MessageDialog(
                None,
                _(u"Un fichier portant ce nom existe déjà. \n\nVoulez-vous le remplacer ?"
                  ), "Attention !",
                wx.YES_NO | wx.NO_DEFAULT | wx.ICON_EXCLAMATION)
            if dlg.ShowModal() == wx.ID_NO:
                return False
                dlg.Destroy()
            else:
                dlg.Destroy()

        # Création du fichier texte
        f = open(cheminFichier, "w")
        f.write(texte.encode("iso-8859-15"))
        f.close()

        # Confirmation de création du fichier et demande d'ouverture directe dans Excel
        txtMessage = _(
            u"Le fichier a été créé avec succès.\n\nSouhaitez-vous l'ouvrir dès maintenant ?"
        )
        dlgConfirm = wx.MessageDialog(
            None, txtMessage, _(u"Confirmation"),
            wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION)
        reponse = dlgConfirm.ShowModal()
        dlgConfirm.Destroy()
        if reponse == wx.ID_NO:
            return
        else:
            FonctionsPerso.LanceFichierExterne(cheminFichier)
Esempio n. 9
0
    def OnBoutonApercu(self, event):
        if self.ValidationSaisie() == False:
            return

        typeImpression = self.ctrl_type.GetType()

        # Récupération des paramètres
        tracks = self.ctrl_factures.GetTracksCoches()
        date_emission = self.ctrl_date.GetDate()
        code_col = self.ctrl_code_coll.GetValue()
        code_nat = self.ctrl_code_nat.GetValue()
        code_rec = self.ctrl_code_rec.GetValue()
        exercice = self.ctrl_exercice.GetValue()
        num_role = self.ctrl_num_role.GetValue()

        listeIDfactures = []
        montantTotal = 0.0
        for track in tracks:
            listeIDfactures.append(track.IDfacture)
            montantTotal += -track.solde

        if len(listeIDfactures) == 0: conditionFactures = "()"
        elif len(listeIDfactures) == 1:
            conditionFactures = "(%d)" % listeIDfactures[0]
        else:
            conditionFactures = str(tuple(listeIDfactures))

        DB = GestionDB.DB()
        req = """
        SELECT prestations.IDprestation, prestations.IDfacture, prestations.label, prestations.montant, 
        prestations.IDindividu, individus.nom, individus.prenom,
        prestations.IDactivite, activites.nom
        FROM prestations
        LEFT JOIN individus ON prestations.IDindividu = individus.IDindividu
        LEFT JOIN activites ON activites.IDactivite = prestations.IDactivite
        WHERE prestations.IDfacture IN %s
        GROUP BY prestations.IDprestation
        ORDER BY prestations.date
        ;""" % conditionFactures
        DB.ExecuterReq(req)
        listePrestations = DB.ResultatReq()
        DB.Close()
        dictPrestations = {}
        dictIndividus = {}
        dictActivites = {}
        dictTotaux = {}
        for IDprestation, IDfacture, label, montant, IDindividu, nom, prenom, IDactivite, nomActivite in listePrestations:

            if dictActivites != None and (IDactivite
                                          in dictActivites) == False:
                dictActivites[IDactivite] = nomActivite

            if IDindividu != None and (
                    IDindividu in dictIndividus) == False and prenom != None:
                dictIndividus[IDindividu] = u"%s %s" % (nom, prenom)

            if (IDfacture in dictPrestations) == False:
                dictPrestations[IDfacture] = {}
            if (IDindividu in dictPrestations[IDfacture]) == False:
                dictPrestations[IDfacture][IDindividu] = {}
            if (label in dictPrestations[IDfacture][IDindividu]) == False:
                dictPrestations[IDfacture][IDindividu][label] = {
                    "quantite": 0,
                    "montant": 0.0,
                    "IDactivite": IDactivite
                }

            if (IDactivite in dictTotaux) == False:
                dictTotaux[IDactivite] = {}
            if (label in dictTotaux[IDactivite]) == False:
                dictTotaux[IDactivite][label] = {"quantite": 0, "montant": 0.0}

            dictTotaux[IDactivite][label]["quantite"] += 1
            dictTotaux[IDactivite][label]["montant"] += montant

            dictPrestations[IDfacture][IDindividu][label]["quantite"] += 1
            dictPrestations[IDfacture][IDindividu][label]["montant"] += montant

        # Création du PDF
        from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, PageBreak
        from reportlab.platypus.flowables import ParagraphAndImage, Image
        from reportlab.rl_config import defaultPageSize
        from reportlab.lib.units import inch, cm
        from reportlab.lib.utils import ImageReader
        from reportlab.lib import colors
        from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
        self.hauteur_page = defaultPageSize[1]
        self.largeur_page = defaultPageSize[0]

        # Initialisation du PDF
        PAGE_WIDTH, PAGE_HEIGHT = defaultPageSize
        nomDoc = FonctionsPerso.GenerationNomDoc("ROLMRE", "pdf")
        if sys.platform.startswith("win"): nomDoc = nomDoc.replace("/", "\\")
        doc = SimpleDocTemplate(nomDoc, topMargin=30, bottomMargin=30)
        story = []

        largeurContenu = 520

        # Création du titre du document
        def Header():
            dataTableau = []
            largeursColonnes = ((420, 100))
            dateDuJour = UTILS_Dates.DateEngFr(str(datetime.date.today()))
            dataTableau.append((_(u"Rôle n°%s-%s") % (exercice, num_role),
                                _(u"%s\nEdité le %s") %
                                (UTILS_Organisateur.GetNom(), dateDuJour)))
            style = TableStyle([
                ('BOX', (0, 0), (-1, -1), 0.25, colors.black),
                ('VALIGN', (0, 0), (-1, -1), 'TOP'),
                ('ALIGN', (0, 0), (0, 0), 'LEFT'),
                ('FONT', (0, 0), (0, 0), "Helvetica-Bold", 16),
                ('ALIGN', (1, 0), (1, 0), 'RIGHT'),
                ('FONT', (1, 0), (1, 0), "Helvetica", 6),
            ])
            tableau = Table(dataTableau, largeursColonnes)
            tableau.setStyle(style)
            story.append(tableau)
            story.append(Spacer(0, 20))

        # Insère un header
        Header()

        couleurFond1 = (0.8, 0.8, 1)  # Vert -> (0.5, 1, 0.2)
        couleurFond2 = (0.9, 0.9, 1)  # Vert -> (0.5, 1, 0.2)
        styleLabel = ParagraphStyle(name="label",
                                    fontName="Helvetica",
                                    alignment=1,
                                    fontSize=5,
                                    spaceAfter=0,
                                    leading=8,
                                    spaceBefore=0)
        styleTexte = ParagraphStyle(name="label",
                                    fontName="Helvetica",
                                    alignment=0,
                                    fontSize=7,
                                    spaceAfter=0,
                                    leading=8,
                                    spaceBefore=0)
        styleTexte2 = ParagraphStyle(name="label",
                                     fontName="Helvetica",
                                     alignment=1,
                                     fontSize=7,
                                     spaceAfter=0,
                                     leading=8,
                                     spaceBefore=0)
        styleMontant = ParagraphStyle(name="label",
                                      fontName="Helvetica",
                                      alignment=2,
                                      fontSize=7,
                                      spaceAfter=0,
                                      leading=8,
                                      spaceBefore=0)

        # Intro
        story.append(
            Paragraph(
                _(u"Date d'émission : %s | Code Collectivité : %s | Code Nature : %s | Code Recette : %s"
                  ) % (UTILS_Dates.DateDDEnFr(date_emission), code_col,
                       code_nat, code_rec), styleTexte))
        story.append(Spacer(0, 20))

        # Factures
        if typeImpression in ("detail", "simple"):

            for track in tracks:

                # Numéro de facture
                dataTableau = []
                largeursColonnes = [100, 100, largeurContenu - 100 - 100]
                dataTableau.append((
                    _(u"Facture n°%s") % track.numero,
                    u"%.2f %s" % (-track.solde, SYMBOLE),
                    _(u"Edité le %s | Echéance le %s | Période du %s au %s")
                    % (UTILS_Dates.DateDDEnFr(track.date_edition),
                       UTILS_Dates.DateDDEnFr(track.date_echeance),
                       UTILS_Dates.DateDDEnFr(track.date_debut),
                       UTILS_Dates.DateDDEnFr(track.date_fin)),
                ))
                tableau = Table(dataTableau, largeursColonnes)
                listeStyles = [
                    ('FONT', (0, 0), (1, -1), "Helvetica-Bold", 7),
                    ('FONT', (2, -1), (2, -1), "Helvetica", 6),
                    ('BACKGROUND', (0, 0), (-1, -1), couleurFond1),
                    ('ALIGN', (2, -1), (2, -1), 'RIGHT'),
                    ('BOX', (0, 0), (-1, -1), 0.25, colors.black),
                ]
                tableau.setStyle(TableStyle(listeStyles))
                story.append(tableau)

                # Famille
                if track.prelevement == True:
                    textePrelevement = _(
                        u"N° Compte : %s | Etab : %s | Guichet : %s | Clé : %s | Titulaire : %s"
                    ) % (track.prelevement_numero, track.prelevement_etab,
                         track.prelevement_guichet, track.prelevement_cle,
                         track.prelevement_payeur)
                else:
                    textePrelevement = u""

                if track.adresse_famille["rue"] != None:
                    rue = track.adresse_famille["rue"]
                else:
                    rue = u""
                if track.adresse_famille["cp"] != None:
                    cp = track.adresse_famille["cp"]
                else:
                    cp = u""
                if track.adresse_famille["ville"] != None:
                    ville = track.adresse_famille["ville"]
                else:
                    ville = u""

                dataTableau = [
                    (Paragraph(_(u"Famille"),
                               styleLabel), Paragraph(_(u"Adresse"),
                                                      styleLabel),
                     Paragraph(_(u"Prélèvement bancaire"), styleLabel)),
                ]
                largeursColonnes = [180, 140, largeurContenu - 320]
                dataTableau.append((
                    Paragraph(track.nomsTitulaires, styleTexte),
                    (Paragraph(rue, styleTexte),
                     Paragraph(u"%s %s" % (cp, ville), styleTexte)),
                    Paragraph(textePrelevement, styleTexte),
                ))
                tableau = Table(dataTableau, largeursColonnes)
                listeStyles = [
                    ('TOPPADDING', (0, 0), (-1, 0), 0),
                    ('BOTTOMPADDING', (0, 0), (-1, 0), -1),
                    ('FONT', (0, -1), (-1, -1), "Helvetica", 7),
                    ('GRID', (0, 0), (-1, 0), 0.25, colors.black),
                    ('BOX', (0, 1), (-1, 1), 0.25, colors.black),
                    ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
                    ('BACKGROUND', (0, 0), (-1, 0), couleurFond2),
                ]
                tableau.setStyle(TableStyle(listeStyles))
                story.append(tableau)

                # Détail des prestations
                if typeImpression == "detail" and track.IDfacture in dictPrestations:

                    dataTableau = [
                        (Paragraph(_(u"Individu"), styleLabel),
                         Paragraph(_(u"Activité"), styleLabel),
                         Paragraph(_(u"Prestation"), styleLabel),
                         Paragraph(_(u"Quantité"), styleLabel),
                         Paragraph(_(u"Montant total"), styleLabel)),
                    ]
                    largeursColonnes = [130, 120, 185, 35, 50]

                    for IDindividu, dictLabels in dictPrestations[
                            track.IDfacture].items():

                        if IDindividu in dictIndividus:
                            labelIndividu = dictIndividus[IDindividu]
                        else:
                            labelIndividu = u""

                        listeActivites = []
                        listeLabels = []
                        listeQuantites = []
                        listeMontants = []
                        for labelPrestation, dictTemp in dictLabels.items():

                            if dictTemp["IDactivite"] != None and dictTemp[
                                    "IDactivite"] in dictActivites:
                                labelActivite = dictActivites[
                                    dictTemp["IDactivite"]]
                            else:
                                labelActivite = u""

                            listeActivites.append(
                                Paragraph(labelActivite[:35], styleTexte2))
                            listeLabels.append(
                                Paragraph(labelPrestation[:40], styleTexte2))
                            listeQuantites.append(
                                Paragraph(str(dictTemp["quantite"]),
                                          styleTexte2))
                            listeMontants.append(
                                Paragraph(
                                    u"%.2f %s" %
                                    (dictTemp["montant"], SYMBOLE),
                                    styleMontant))

                        dataTableau.append((
                            Paragraph(labelIndividu, styleTexte2),
                            listeActivites,
                            listeLabels,
                            listeQuantites,
                            listeMontants,
                        ))

                    tableau = Table(dataTableau, largeursColonnes)
                    listeStyles = [
                        ('TOPPADDING', (0, 0), (-1, 0), 0),
                        ('BOTTOMPADDING', (0, 0), (-1, 0), -1),
                        ('FONT', (0, -1), (-1, -1), "Helvetica", 7),
                        ('GRID', (0, 0), (-1, -1), 0.25, colors.black),
                        ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
                        ('BACKGROUND', (0, 0), (-1, 0), couleurFond2),
                    ]
                    tableau.setStyle(TableStyle(listeStyles))
                    story.append(tableau)

                story.append(Spacer(0, 10))

        # Totaux
        dictTotaux[IDactivite][label]["montant"]

        dataTableau = [
            (_(u"Totaux par activités et prestations"), "", "", ""),
            (Paragraph(_(u"Activités"),
                       styleLabel), Paragraph(_(u"Prestations"), styleLabel),
             Paragraph(_(u"Quantité"),
                       styleLabel), Paragraph(_(u"Montant"), styleLabel)),
        ]
        largeursColonnes = [200, 240, 30, 50]

        for IDactivite, dictLabels in dictTotaux.items():

            if IDactivite == None:
                nomActivite = _(u"Prestations diverses")
            else:
                nomActivite = dictActivites[IDactivite]

            listeLabels = []
            listeQuantites = []
            listeMontants = []
            quantiteActivite = 0
            totalActivite = 0.0
            for label, dictTemp in dictLabels.items():
                listeLabels.append(Paragraph(label, styleTexte2))
                listeQuantites.append(
                    Paragraph(str(dictTemp["quantite"]), styleTexte2))
                listeMontants.append(
                    Paragraph(u"%.2f %s" % (dictTemp["montant"], SYMBOLE),
                              styleMontant))
                quantiteActivite += dictTemp["quantite"]
                totalActivite += dictTemp["montant"]

            listeLabels.append(
                Paragraph(_(u"<b><i>Total de l'activité</i></b>"),
                          styleTexte2))
            listeQuantites.append(
                Paragraph("<b><i>%d</i></b>" % quantiteActivite, styleTexte2))
            listeMontants.append(
                Paragraph(u"<b><i>%.2f %s</i></b>" % (totalActivite, SYMBOLE),
                          styleMontant))

            dataTableau.append((
                Paragraph(nomActivite, styleTexte2),
                listeLabels,
                listeQuantites,
                listeMontants,
            ))

        tableau = Table(dataTableau, largeursColonnes)
        listeStyles = [
            ('TOPPADDING', (0, 1), (-1, 1), 0),
            ('BOTTOMPADDING', (0, 1), (-1, 1), -1),
            ('FONT', (1, -1), (-1, -1), "Helvetica", 7),
            ('FONT', (0, 0), (0, 0), "Helvetica-Bold", 7),
            ('BOX', (0, 0), (-1, 0), 0.25, colors.black),
            ('GRID', (0, 1), (-1, -1), 0.25, colors.black),
            ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
            ('BACKGROUND', (0, 0), (-1, 0), couleurFond1),
            ('BACKGROUND', (0, 1), (-1, 1), couleurFond2),
        ]
        tableau.setStyle(TableStyle(listeStyles))
        story.append(tableau)

        story.append(Spacer(0, 10))

        story.append(
            Paragraph(
                _(u"%d factures | Montant total : %.2f %s") %
                (len(tracks), montantTotal, SYMBOLE), styleTexte))

        # Enregistrement et ouverture du PDF
        try:
            doc.build(story)
        except Exception as err:
            print("Erreur dans ouverture PDF :", err)
            if "Permission denied" in err:
                dlg = wx.MessageDialog(
                    None,
                    _(u"Noethys ne peut pas créer le PDF.\n\nVeuillez vérifier qu'un autre PDF n'est pas déjà ouvert en arrière-plan..."
                      ), _(u"Erreur d'édition"), wx.OK | wx.ICON_ERROR)
                dlg.ShowModal()
                dlg.Destroy()
                return False

        FonctionsPerso.LanceFichierExterne(nomDoc)
Esempio n. 10
0
    def __init__(self,
                 titre="",
                 annee=2009,
                 afficher_we=True,
                 afficher_vacances=True,
                 afficher_feries=True,
                 afficher_heures=True,
                 afficher_couleurs_categories=True,
                 afficher_legende=True,
                 afficher_heures_mois=True):

        self.titre = titre
        self.annee = annee

        global AFFICHER_WE, AFFICHER_VACANCES, AFFICHER_FERIES, AFFICHER_HEURES, AFFICHER_COULEUR_CATEGORIES, AFFICHER_LEGENDE, AFFICHER_HEURES_MOIS
        AFFICHER_WE = afficher_we
        AFFICHER_VACANCES = afficher_vacances
        AFFICHER_FERIES = afficher_feries
        AFFICHER_HEURES = afficher_heures
        AFFICHER_COULEUR_CATEGORIES = afficher_couleurs_categories
        AFFICHER_LEGENDE = afficher_legende
        AFFICHER_HEURES_MOIS = afficher_heures_mois

        largeurMois = 55
        espaceMois = 5

        # Paramètres du PDF
        nomDoc = FonctionsPerso.GenerationNomDoc("CALENDRIER_ANNUEL", "pdf")
        if "win" in sys.platform: nomDoc = nomDoc.replace("/", "\\")
        taillePage = landscape(A4)
        HAUTEUR_PAGE = defaultPageSize[0]
        LARGEUR_PAGE = defaultPageSize[1]

        doc = SimpleDocTemplate(nomDoc,
                                pagesize=taillePage,
                                topMargin=50,
                                bottomMargin=50)
        story = []

        # Création du titre du document
        largeursColonnesTitre = ((615, 100))
        dateDuJour = DatetimeDateEnStr(datetime.date.today())
        dataTableauTitre = [
            (_(u"Planning %d de %s") % (self.annee, self.titre),
             _(u"Edité le %s") % dateDuJour),
        ]
        styleTitre = TableStyle([
            ('BOX', (0, 0), (-1, -1), 0.25, colors.black),
            ('VALIGN', (0, 0), (-1, -1), 'TOP'),
            ('ALIGN', (0, 0), (0, 0), 'LEFT'),
            ('FONT', (0, 0), (0, 0), "Helvetica-Bold", 16),
            ('ALIGN', (1, 0), (1, 0), 'RIGHT'),
            ('FONT', (1, 0), (1, 0), "Helvetica", 6),
        ])
        tableauTitre = Table(dataTableauTitre, largeursColonnesTitre)
        tableauTitre.setStyle(styleTitre)
        story.append(tableauTitre)
        story.append(Spacer(0, 20))

        # Récupération des données
        self.dictPresences, self.dictTotauxCategories = {}, {
        }  #self.ImportPresences(self.IDpersonne, self.annee)

        global DICT_CATEGORIES, LISTE_VACANCES, LISTE_FERIES
        DICT_CATEGORIES = self.ImportCategories()
        LISTE_VACANCES = self.Importation_Vacances()
        LISTE_FERIES = self.Importation_Feries()

        # Création du tableau
        dataTableau = []
        enteteTableau = []
        largeursColonnes = []
        styleTableau = []

        listeMois = (_(u"Janvier"), _(u"Février"), _(u"Mars"), _(u"Avril"),
                     _(u"Mai"), _(u"Juin"), _(u"Juillet"), _(u"Août"),
                     _(u"Septembre"), _(u"Octobre"), _(u"Novembre"),
                     _(u"Décembre"))
        listeJours = (u"L", u"M", u"M", u"J", u"V", u"S", u"D")

        # Création de l'entete du tableau
        index = 1
        for nomMois in listeMois:
            largeursColonnes.append(largeurMois)
            if index != 12: largeursColonnes.append(espaceMois)
            enteteTableau.append(nomMois)
            if index != 12: enteteTableau.append("")
            index += 1
        dataTableau.append(enteteTableau)
        styleTableau.append(('ALIGN', (0, 0), (-1, 0), 'CENTRE'))
        styleTableau.append(('FONT', (0, 0), (-1, 0), "Helvetica-Bold", 8))

        # Création des lignes vides
        for x in range(1, 33):
            ligne = []
            for case in range(0, 23):
                ligne.append(None)
            dataTableau.append(ligne)

        # Style général du tableau
        styleTableau.append(('FONT', (0, 1), (-1, -1), "Helvetica", 7))
        styleTableau.append(('LEFTPADDING', (0, 1), (-1, -1), 0))
        styleTableau.append(('RIGHTPADDING', (0, 1), (-1, -1), 0))
        styleTableau.append(('TOPPADDING', (0, 1), (-1, -1), 0))
        styleTableau.append(('BOTTOMPADDING', (0, 1), (-1, -1), 0))

        # Remplissage du tableau
        numMois = 1
        for nomMois in listeMois:
            # Création d'un mois
            totalMinutesMois = 0
            numWeekDay, nbreJoursMois = calendar.monthrange(
                self.annee, numMois)
            numCol = (numMois * 2) - 2

            for numJour in range(1, nbreJoursMois + 1):
                # Création des labels des dates
                dateDD = datetime.date(year=self.annee,
                                       month=numMois,
                                       day=numJour)
                nomJour = listeJours[dateDD.weekday()]
                labelDate = u"%s %d" % (nomJour, numJour)

                # Création du contenu de chaque case
                if dateDD in self.dictPresences:
                    dictBarres = self.dictPresences[dateDD]
                else:
                    dictBarres = {}
                case = CaseDate(xoffset=0,
                                hauteurCase=10,
                                largeurCase=largeurMois,
                                dateDD=dateDD,
                                labelDate=labelDate,
                                dictBarres=dictBarres)
                dataTableau[numJour][numCol] = case

                # Calcule le nbre d'heures du mois
                if dateDD in self.dictPresences:
                    totalMinutesMois += self.dictPresences[dateDD]["totalJour"]

            # Ecrit le nombre d'heures du mois
            if AFFICHER_HEURES_MOIS == True and totalMinutesMois != 0:
                numJour += 1
                dataTableau[numJour][numCol] = minutesEnHeures(
                    totalMinutesMois)
                styleTableau.append(('FONT', (numCol, numJour),
                                     (numCol, numJour), "Helvetica", 5))
                styleTableau.append(
                    ('ALIGN', (numCol, numJour), (numCol, numJour), "RIGHT"))
                styleTableau.append(
                    ('VALIGN', (numCol, numJour), (numCol, numJour), "TOP"))

            # Définit le style du tableau
            styleTableau.append(('GRID', (numCol, 0), (numCol, nbreJoursMois),
                                 0.25, colors.black))

            numMois += 1

        tableau = Table(dataTableau, largeursColonnes)
        tableau.setStyle(TableStyle(styleTableau))
        story.append(tableau)
        story.append(Spacer(0, 25))

        # Légendes des catégories
        dataTableauLegende = []
        largeursColonnesLegende = []
        styleTableauLegende = []

        # Création des lignes vides du tableau des légendes
        nbreLignesLegendes = 5
        nbreColonnesLegendes = 4
        largeurColonneLegende = 178.75

        for numLigne in range(0, nbreLignesLegendes):
            ligne = []
            for numCol in range(0, nbreColonnesLegendes):
                ligne.append(None)
            dataTableauLegende.append(ligne)

        # Création de la liste des largeurs des colonnes
        for x in range(0, nbreColonnesLegendes):
            largeursColonnesLegende.append(largeurColonneLegende)

        # Remplissage du tableau des légendes
        nbre_legendes = 0
        total_heures = 0
        numLigne = 0
        numCol = 0

        if AFFICHER_VACANCES == True:
            dataTableauLegende[numLigne][numCol] = CaseLegende(
                0, 10, _(u"Vacances"), COULEUR_VACANCES, None)
            numLigne += 1
        if AFFICHER_WE == True:
            dataTableauLegende[numLigne][numCol] = CaseLegende(
                0, 10, _(u"Week-ends"), COULEUR_WE, None)
            numLigne += 1
        if AFFICHER_FERIES == True:
            dataTableauLegende[numLigne][numCol] = CaseLegende(
                0, 10, _(u"Jours fériés"), COULEUR_FERIES, None)
            numLigne += 1

        for IDcategorie, nbreHeures in self.dictTotauxCategories.items():
            if IDcategorie != "totalAnnee":
                nom_categorie, ordre, couleur = DICT_CATEGORIES[IDcategorie]
                legende = CaseLegende(0, 10, nom_categorie, couleur,
                                      nbreHeures)
                dataTableauLegende[numLigne][numCol] = legende
                nbre_legendes += 1
                total_heures += nbreHeures

                numLigne += 1
                if numLigne == nbreLignesLegendes:
                    numLigne = 0
                    numCol += 1

        if nbre_legendes > 1:
            # Ajoute un total d'heures pour l'année
            legende = CaseLegende(0, 10, _(u"Total pour l'année"), None,
                                  total_heures)
            dataTableauLegende[numLigne][numCol] = legende

        styleTableauLegende.append(('FONT', (0, 1), (-1, -1), "Helvetica", 6))
        styleTableauLegende.append(('LEFTPADDING', (0, 0), (-1, -1), 0))
        styleTableauLegende.append(('RIGHTPADDING', (0, 0), (-1, -1), 0))
        styleTableauLegende.append(('TOPPADDING', (0, 0), (-1, -1), 0))
        styleTableauLegende.append(('BOTTOMPADDING', (0, 0), (-1, -1), 0))

        tableauLegende = Table(dataTableauLegende, largeursColonnesLegende)
        tableauLegende.setStyle(TableStyle(styleTableauLegende))
        if AFFICHER_LEGENDE == True:
            story.append(tableauLegende)

        # Enregistrement du PDF
        doc.build(story)
        # Affichage du PDF
        FonctionsPerso.LanceFichierExterne(nomDoc)
Esempio n. 11
0
class Impression():
    def __init__(self,
                 dictDonnees={},
                 nomDoc=FonctionsPerso.GenerationNomDoc(
                     "RECUDONAUXOEUVRES", "pdf"),
                 afficherDoc=True):
        """ Imprime un reçu Dons aux Oeuvres """

        from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle
        from reportlab.rl_config import defaultPageSize
        from reportlab.lib.units import inch, cm
        from reportlab.lib import colors
        from reportlab.lib.styles import getSampleStyleSheet
        styleSheet = getSampleStyleSheet()
        self.hauteur_page = defaultPageSize[1]
        self.largeur_page = defaultPageSize[0]
        self.inch = inch

        # Initialisation du PDF
        PAGE_HEIGHT = defaultPageSize[1]
        PAGE_WIDTH = defaultPageSize[0]
        doc = SimpleDocTemplate(nomDoc)
        story = []

        # ---------------- Titre du document ----------------------------------------------------------------

        largeursColonnes = ((300, 150))

        txt1 = Paragraph(
            u"""
        <para align=center fontSize=16><b>Reçu Dons Aux Oeuvres</b></para>
        """, styleSheet['BodyText'])

        txt2 = Paragraph(
            u"""
        <para align=center fontSize=8>Numéro d'ordre du reçu</para>
        """, styleSheet['BodyText'])

        txt3 = Paragraph(
            u"""
        <para align=center fontSize=9>(Article 200-5 du Code Général des Impôts)</para>
        """, styleSheet['BodyText'])

        txt4 = Paragraph(
            u"""
        <para align=center fontsize=16>%s</para>
        """ % dictDonnees["numero"], styleSheet['BodyText'])

        # Valeurs du tableau
        dataTableau = [
            ["", txt2],
            [[txt1, txt3], txt4],
        ]

        # Style du tableau
        style = TableStyle([
            ('GRID', (1, 1), (1, 1), 0.25, colors.black),
            ('VALIGN', (0, 0), (-1, -1), "MIDDLE"),
        ])
        tableau = Table(dataTableau, largeursColonnes)
        tableau.setStyle(style)
        story.append(tableau)
        story.append(Spacer(0, 20))

        # ------------ Corps du document -----------------------------------------------------
        largeursColonnes = ((450, ))

        # Texte du tableau
        txt10 = Paragraph(
            u"""
        <para align=center><b>Bénéficiaire des versements</b></para>
        """, styleSheet['BodyText'])

        txt20 = Paragraph(
            u"""
        <br/>
        Nom ou dénomination : %s<br/>
        <br/>
        Adresse : %s<br/>
        <br/>
        Objet : %s<br/>
        <br/>
        %s<br/>   
        <br/>     
        """ % (dictDonnees["nom_organisme"], dictDonnees["adresse_organisme"],
               dictDonnees["objet_organisme"], dictDonnees["type_organisme"]),
            styleSheet['BodyText'])

        # Donateur
        txt30 = Paragraph(
            u"""
        <para align=center><b>Donateur</b></para>
        """, styleSheet['BodyText'])

        txt40 = Paragraph(
            u"""
        <br/>
        Nom : %s<br/>
        <br/>
        Adresse : %s
        <br/>
        <br/>
        """ % (dictDonnees["nom_donateur"], dictDonnees["adresse_donateur"]),
            styleSheet['BodyText'])

        # Montant
        txt50 = Paragraph(
            u"""
        <para align=center><b>Versement</b></para>
        """, styleSheet['BodyText'])

        txt60 = Paragraph(
            u"""
        <br/>
        Le bénéficiaire reconnaît avoir reçu au titre des versements ouvrant droit à réduction d'impôt la somme de : <br/>
        <br/>
        """, styleSheet['BodyText'])

        txt70 = Paragraph(
            u"""
        <para align=center fontSize=12>
        <b>%s</b><br/>
        <br/>
        <b>Soit %s</b>
        </para>
        """ %
            (dictDonnees["montant_chiffres"], dictDonnees["montant_lettres"]),
            styleSheet['BodyText'])

        txt80 = Paragraph(
            u"""
        <br/>
        Date du paiement : %s<br/>
        <br/>
        Mode de versement : %s
        <br/>
        <br/>
        """ % (dictDonnees["date_versement"], dictDonnees["mode"]),
            styleSheet['BodyText'])

        txt100 = Paragraph(
            u"""
        Fait en double exemplaire<br/>
        (Un pour le donateur - un pour l'association)<br/>
        <br/>
        """, styleSheet['BodyText'])

        if dictDonnees["date_edition"] != u"":
            date_edition = _(u"Le %s") % dictDonnees["date_edition"]
        else:
            dictDonnees["date_edition"] = u""

        txt110 = Paragraph(
            u"""
        <para align=right rightIndent=50>
        Date et signature
        <br/>
        <br/>
        %s
        <br/>
        <br/>
        <br/>
        <br/>
        <br/>
        <br/>
        </para>
        """ % date_edition, styleSheet['BodyText'])

        # Valeurs du tableau
        dataTableau = [
            [
                txt10,
            ],
            [
                txt20,
            ],
            [
                "",
            ],
            [
                txt30,
            ],
            [
                txt40,
            ],
            [
                "",
            ],
            [
                txt50,
            ],
            [
                [txt60, txt70, txt80, txt100, txt110],
            ],
        ]

        # Style du tableau
        style = TableStyle([
            ('GRID', (0, 0), (0, 1), 0.25, colors.black),
            ('GRID', (0, 3), (0, 4), 0.25, colors.black),
            ('GRID', (0, 6), (0, 7), 0.25, colors.black),
        ])
        tableau = Table(dataTableau, largeursColonnes)
        tableau.setStyle(style)
        story.append(tableau)
        story.append(Spacer(0, 20))

        # Enregistrement du PDF
        try:
            doc.build(story)
        except Exception, err:
            print "Erreur dans ouverture PDF :", err
            if "Permission denied" in err:
                dlg = wx.MessageDialog(
                    None,
                    _(u"Noethys ne peut pas créer le PDF.\n\nVeuillez vérifier qu'un autre PDF n'est pas déjà ouvert en arrière-plan..."
                      ), _(u"Erreur d'édition"), wx.OK | wx.ICON_ERROR)
                dlg.ShowModal()
                dlg.Destroy()
                return

        # Affichage du PDF
        if afficherDoc == True:
            FonctionsPerso.LanceFichierExterne(nomDoc)
Esempio n. 12
0
    def ExportExcel(self, event=None):
        """ Export Excel """
        if self.mode == "attente":
            titre = _(u"Inscriptions en attente")
        else:
            titre = _(u"Inscriptions refusées")

        # Demande à l'utilisateur le nom de fichier et le répertoire de destination
        nomFichier = "ExportExcel_%s.xlsx" % datetime.datetime.now().strftime(
            "%Y%m%d%H%M%S")
        wildcard = "Fichier Excel (*.xlsx)|*.xlsx|" \
                        "All files (*.*)|*.*"
        sp = wx.StandardPaths.Get()
        cheminDefaut = sp.GetDocumentsDir()
        dlg = wx.FileDialog(
            None,
            message=
            _(u"Veuillez sélectionner le répertoire de destination et le nom du fichier"
              ),
            defaultDir=cheminDefaut,
            defaultFile=nomFichier,
            wildcard=wildcard,
            style=wx.FD_SAVE)
        dlg.SetFilterIndex(0)
        if dlg.ShowModal() == wx.ID_OK:
            cheminFichier = dlg.GetPath()
            dlg.Destroy()
        else:
            dlg.Destroy()
            return

        # Le fichier de destination existe déjà :
        if os.path.isfile(cheminFichier) == True:
            dlg = wx.MessageDialog(
                None,
                _(u"Un fichier portant ce nom existe déjà. \n\nVoulez-vous le remplacer ?"
                  ), "Attention !",
                wx.YES_NO | wx.NO_DEFAULT | wx.ICON_EXCLAMATION)
            if dlg.ShowModal() == wx.ID_NO:
                return False
                dlg.Destroy()
            else:
                dlg.Destroy()

        # Export
        import xlsxwriter
        classeur = xlsxwriter.Workbook(cheminFichier)
        feuille = classeur.add_worksheet(titre)

        # Entetes et largeurs des colonnes
        colonnes = [
            (_(u"Date"), 20),
            (_(u"Groupe"), 15),
            (_(u"Dispo"), 10),
            (_(u"N°"), 10),
            (_(u"Individu"), 30),
            (_(u"Date de saisie"), 30),
            (_(u"Catégorie de tarif"), 30),
        ]
        index = 0
        for label, largeur in colonnes:
            feuille.set_column(index, index, largeur)
            feuille.write(0, index, label)
            index += 1

        # Contenu
        x = 1
        for activite, listeGroupes in self.listeImpression:
            for nomGroupe, listeIndividus in listeGroupes:
                for dictIndividu in listeIndividus:
                    placeDispo = dictIndividu["placeDispo"]
                    if placeDispo == True:
                        placeDispoTxt = _(u"Oui")
                    else:
                        placeDispoTxt = _(u"None")

                    feuille.write(x, 0, activite)
                    feuille.write(x, 1, nomGroupe)
                    feuille.write(x, 2, placeDispoTxt)
                    feuille.write(x, 3, dictIndividu["num"])
                    feuille.write(x, 4, dictIndividu["nomIndividu"])
                    feuille.write(x, 5, dictIndividu["texteDateSaisie"])
                    feuille.write(x, 6, dictIndividu["nomCategorie"])

                    x += 1

        # Finalisation du fichier xlsx
        classeur.close()

        # Confirmation de création du fichier et demande d'ouverture directe dans Excel
        txtMessage = _(
            u"Le fichier Excel a été créé avec succès. Souhaitez-vous l'ouvrir dès maintenant ?"
        )
        dlgConfirm = wx.MessageDialog(
            None, txtMessage, _(u"Confirmation"),
            wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION)
        reponse = dlgConfirm.ShowModal()
        dlgConfirm.Destroy()
        if reponse == wx.ID_NO:
            return
        else:
            FonctionsPerso.LanceFichierExterne(cheminFichier)
Esempio n. 13
0
    def OnBoutonFichier(self, event):
        """ Génération d'un fichier normalisé """
        # Validation des données
        if self.ValidationDonnees() == False:
            return False

        # Vérifie que des pièces existent
        if not (self.ctrl_pieces.GetObjects()):
            dlg = wx.MessageDialog(
                self, _(u"Vous devez ajouter au moins une pièce !"),
                _(u"Erreur"), wx.OK | wx.ICON_EXCLAMATION)
            dlg.ShowModal()
            dlg.Destroy()
            return False

        # Récupération des infos sur la remise
        remise_nom = DLG_Saisie_lot_tresor_public.Supprime_accent(
            self.ctrl_nom.GetValue())
        nom_fichier = remise_nom

        nomOrganisateur = UTILS_Organisateur.GetNom()

        # Génération des pièces jointes
        dict_pieces_jointes = False
        if self.ctrl_parametres.GetPropertyValue(
                "inclure_pieces_jointes") == True:
            dict_pieces_jointes = self.GenerationPiecesJointes()
            if dict_pieces_jointes == False:
                return False

        # Récupération des transactions à effectuer
        montantTotal = FloatToDecimal(0.0)
        nbreTotal = 0
        listeAnomalies = []
        listePieces = []
        for track in self.ctrl_pieces.GetObjects():
            montant = FloatToDecimal(track.montant)

            if track.analysePiece == False:
                listeAnomalies.append(u"%s : %s" %
                                      (track.libelle, track.analysePieceTexte))

            # Objet de la pièce
            objet_piece = self.ctrl_parametres.GetPropertyValue("objet_piece")
            objet_piece = DLG_Saisie_lot_tresor_public.Supprime_accent(
                objet_piece).upper()
            objet_piece = objet_piece.replace("{NOM_ORGANISATEUR}",
                                              nomOrganisateur)
            objet_piece = objet_piece.replace("{NUM_FACTURE}",
                                              str(track.numero))
            objet_piece = objet_piece.replace("{LIBELLE_FACTURE}",
                                              track.libelle)
            objet_piece = objet_piece.replace(
                "{MOIS}", str(self.ctrl_parametres.GetPropertyValue("mois")))
            objet_piece = objet_piece.replace(
                "{MOIS_LETTRES}",
                DLG_Saisie_lot_tresor_public.GetMoisStr(
                    self.ctrl_parametres.GetPropertyValue("mois"),
                    majuscules=True,
                    sansAccents=True))
            objet_piece = objet_piece.replace(
                "{ANNEE}",
                str(self.ctrl_parametres.GetPropertyValue("exercice")))

            # Création du libellé du prélèvement
            prelevement_libelle = self.ctrl_parametres.GetPropertyValue(
                "prelevement_libelle")
            prelevement_libelle = prelevement_libelle.replace(
                "{NOM_ORGANISATEUR}", nomOrganisateur)
            prelevement_libelle = prelevement_libelle.replace(
                "{OBJET_PIECE}", objet_piece)
            prelevement_libelle = prelevement_libelle.replace(
                "{LIBELLE_FACTURE}", track.libelle)
            prelevement_libelle = prelevement_libelle.replace(
                "{NUM_FACTURE}", str(track.numero))
            prelevement_libelle = prelevement_libelle.replace(
                "{MOIS}", str(self.ctrl_parametres.GetPropertyValue("mois")))
            prelevement_libelle = prelevement_libelle.replace(
                "{MOIS_LETTRES}",
                DLG_Saisie_lot_tresor_public.GetMoisStr(
                    self.ctrl_parametres.GetPropertyValue("mois"),
                    majuscules=True,
                    sansAccents=True))
            prelevement_libelle = prelevement_libelle.replace(
                "{ANNEE}",
                str(self.ctrl_parametres.GetPropertyValue("exercice")))

            dictPiece = {
                "id_piece": str(track.IDfacture),
                "objet_piece": objet_piece,
                "num_dette": str(track.numero),
                "montant": str(montant),
                "sequence": track.prelevement_sequence,
                "prelevement": track.prelevement,
                "prelevement_date_mandat": str(track.prelevement_date_mandat),
                "prelevement_rum": track.prelevement_rum,
                "prelevement_bic": track.prelevement_bic,
                "prelevement_iban": track.prelevement_iban,
                "prelevement_titulaire": track.prelevement_titulaire,
                "prelevement_libelle": prelevement_libelle,
                "titulaire_civilite": track.titulaireCivilite,
                "titulaire_nom": track.titulaireNom,
                "titulaire_prenom": track.titulairePrenom,
                "titulaire_rue": track.titulaireRue,
                "titulaire_cp": track.titulaireCP,
                "titulaire_ville": track.titulaireVille,
                "idtiers_helios": track.idtiers_helios,
                "natidtiers_helios": track.natidtiers_helios,
                "reftiers_helios": track.reftiers_helios,
                "cattiers_helios": track.cattiers_helios,
                "natjur_helios": track.natjur_helios,
                "IDfacture": track.IDfacture,
            }
            listePieces.append(dictPiece)
            montantTotal += montant
            nbreTotal += 1

        # Mémorisation de tous les données
        dictDonnees = {
            "nom_fichier":
            nom_fichier,
            "date_emission":
            UTILS_Dates.ConvertDateWXenDate(
                self.ctrl_parametres.GetPropertyValue(
                    "date_emission")).strftime("%Y-%m-%d"),
            "date_envoi":
            UTILS_Dates.ConvertDateWXenDate(
                self.ctrl_parametres.GetPropertyValue("date_envoi")).strftime(
                    "%Y-%m-%d"),
            "date_prelevement":
            UTILS_Dates.ConvertDateWXenDate(
                self.ctrl_parametres.GetPropertyValue(
                    "date_prelevement")).strftime("%Y-%m-%d"),
            "id_poste":
            self.ctrl_parametres.GetPropertyValue("id_poste"),
            "id_collectivite":
            self.ctrl_parametres.GetPropertyValue("id_collectivite"),
            "code_collectivite":
            self.ctrl_parametres.GetPropertyValue("code_collectivite"),
            "code_budget":
            self.ctrl_parametres.GetPropertyValue("code_budget"),
            "exercice":
            str(self.ctrl_parametres.GetPropertyValue("exercice")),
            "mois":
            str(self.ctrl_parametres.GetPropertyValue("mois")),
            "id_bordereau":
            self.ctrl_parametres.GetPropertyValue("id_bordereau"),
            "montant_total":
            str(montantTotal),
            "objet_dette":
            self.ctrl_parametres.GetPropertyValue("objet_dette"),
            "code_prodloc":
            self.ctrl_parametres.GetPropertyValue("code_prodloc"),
            "code_etab":
            self.ctrl_parametres.GetPropertyValue("code_etab"),
            "pieces":
            listePieces,
            "pieces_jointes":
            dict_pieces_jointes,
        }

        if len(listeAnomalies) > 0:
            import wx.lib.dialogs as dialogs
            message = "\n".join(listeAnomalies)
            dlg = dialogs.MultiMessageDialog(
                self,
                _(u"Le fichier ne peut être généré en raison des anomalies suivantes :"
                  ),
                caption=_(u"Génération impossible"),
                msg2=message,
                style=wx.ICON_ERROR | wx.OK,
                icon=None,
                btnLabels={wx.ID_OK: _(u"Fermer")})
            dlg.ShowModal()
            dlg.Destroy()
            return

        # Génération du fichier XML
        doc = UTILS_Pes.GetXML(dictDonnees)
        xml = doc.toprettyxml(encoding="utf-8")

        # Validation XSD
        valide = UTILS_Pes.ValidationXSD(xml)
        if valide != True:
            liste_erreurs = valide
            dlg = DLG_Messagebox.Dialog(
                self,
                titre=_(u"Validation XSD"),
                introduction=_(
                    u"Les %d anomalies suivantes ont été détectées :") %
                len(liste_erreurs),
                detail=u"\n".join(liste_erreurs),
                conclusion=
                _(u"Le fichier ne semble pas valide. Souhaitez-vous continuer quand même ?"
                  ),
                icone=wx.ICON_EXCLAMATION,
                boutons=[_(u"Oui"), _(u"Non"),
                         _(u"Annuler")])
            reponse = dlg.ShowModal()
            dlg.Destroy()
            if reponse in (1, 2):
                return False

        # Demande à l'utilisateur le nom de fichier et le répertoire de destination
        wildcard = "Fichier XML (*.xml)|*.xml| All files (*.*)|*.*"
        sp = wx.StandardPaths.Get()
        cheminDefaut = sp.GetDocumentsDir()
        dlg = wx.FileDialog(
            None,
            message=
            _(u"Veuillez sélectionner le répertoire de destination et le nom du fichier"
              ),
            defaultDir=cheminDefaut,
            defaultFile=nom_fichier,
            wildcard=wildcard,
            style=wx.FD_SAVE)
        dlg.SetFilterIndex(0)
        if dlg.ShowModal() == wx.ID_OK:
            cheminFichier = dlg.GetPath()
            dlg.Destroy()
        else:
            dlg.Destroy()
            return

        # Le fichier de destination existe déjà :
        if os.path.isfile(cheminFichier) == True:
            dlg = wx.MessageDialog(
                None,
                _(u"Un fichier portant ce nom existe déjà. \n\nVoulez-vous le remplacer ?"
                  ), _(u"Attention !"),
                wx.YES_NO | wx.NO_DEFAULT | wx.ICON_EXCLAMATION)
            if dlg.ShowModal() == wx.ID_NO:
                return False
                dlg.Destroy()
            else:
                dlg.Destroy()

        # Création du fichier texte
        f = open(cheminFichier, "w")
        try:
            if six.PY2:
                f.write(doc.toxml(encoding="ISO-8859-1"))
            else:
                #f.write(doc.toprettyxml(indent="  "))
                f.write(doc.toxml())
        finally:
            f.close()

        # Confirmation de création du fichier et demande d'ouverture directe
        txtMessage = _(
            u"Le fichier xml PES Recette ORMC a été créé avec succès.\n\nSouhaitez-vous visualiser son contenu maintenant ?"
        )
        dlgConfirm = wx.MessageDialog(
            None, txtMessage, _(u"Confirmation"),
            wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION)
        reponse = dlgConfirm.ShowModal()
        dlgConfirm.Destroy()
        if reponse == wx.ID_NO:
            return
        else:
            FonctionsPerso.LanceFichierExterne(cheminFichier)
Esempio n. 14
0
class Dialog(wx.Dialog):
    def __init__(self, parent, filtres=[]):
        wx.Dialog.__init__(self, parent, -1, style=wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER|wx.MAXIMIZE_BOX|wx.MINIMIZE_BOX)
        self.parent = parent

        # Bandeau
        intro = _(u"Vous pouvez ici exporter les factures au format ROLMRE pour Hélios. Cochez les factures à inclure dans le rôle puis cliquez sur le bouton Fichier pour générer un fichier de transfert normalisé ou le bouton Impression pour imprimer des versions papier.")
        titre = _(u"Export vers Hélios (ROLMRE)")
        self.SetTitle(titre)
        self.ctrl_bandeau = CTRL_Bandeau.Bandeau(self, titre=titre, texte=intro, hauteurHtml=30, nomImage="Images/32x32/Helios.png")
        
        # Factures
        self.box_factures_staticbox = wx.StaticBox(self, -1, _(u"Factures"))
        self.ctrl_factures = CTRL_Liste_factures.CTRL(self, filtres=filtres)
        
        # Paramètres
        self.box_parametres_staticbox = wx.StaticBox(self, -1, _(u"Paramètres du rôle"))
        self.label_date = wx.StaticText(self, -1, _(u"Date d'émission :"))
        self.ctrl_date = CTRL_Saisie_date.Date2(self)
        self.label_exercice = wx.StaticText(self, -1, _(u"Exercice :"))
        self.ctrl_exercice = wx.TextCtrl(self, -1, u"")
        self.label_num_role = wx.StaticText(self, -1, _(u"Numéro de rôle :"))
        self.ctrl_num_role = wx.TextCtrl(self, -1, u"")
        self.label_code_coll = wx.StaticText(self, -1, _(u"Code collectivité :"))
        self.ctrl_code_coll = wx.TextCtrl(self, -1, u"")
        self.label_code_nat = wx.StaticText(self, -1, _(u"Code Nature :"))
        self.ctrl_code_nat = wx.TextCtrl(self, -1, u"")
        self.label_code_rec = wx.StaticText(self, -1, _(u"Code Recette :"))
        self.ctrl_code_rec = wx.TextCtrl(self, -1, u"")
        
        self.ctrl_code_coll.SetMaxLength(2)
        self.ctrl_code_nat.SetMaxLength(2)
        self.ctrl_code_rec.SetMaxLength(2)
        self.ctrl_num_role.SetMaxLength(2)
        self.ctrl_exercice.SetMaxLength(4)

        self.ctrl_code_coll.SetMinSize((50, -1))
        self.ctrl_code_nat.SetMinSize((50, -1))
        self.ctrl_code_rec.SetMinSize((50, -1))
        self.ctrl_num_role.SetMinSize((50, -1))

        # Sortie
        self.box_fichier_staticbox = wx.StaticBox(self, -1, _(u"Fichier"))
        self.box_impression_staticbox = wx.StaticBox(self, -1, _(u"Impression"))
        self.bouton_fichier = CTRL_Bouton_image.CTRL(self, texte=_(u"Générer le fichier ROLMRE"), cheminImage="Images/32x32/Disk.png")
        self.label_type = wx.StaticText(self, -1, _(u"Type :"))
        self.label_type.Show(False)
        self.ctrl_type = CTRL_Type_impression(self, donnees=[ {"label" : _(u"Rôle détaillé"), "description" : _(u"Détail des prestations par famille"), "image" : wx.Bitmap(Chemins.GetStaticPath(u"Images/32x32/Facture.png"), wx.BITMAP_TYPE_ANY)},
                                                                    {"label" : _(u"Rôle simplifié"), "description" : _(u"Total des prestations par famille"), "image" : wx.Bitmap(Chemins.GetStaticPath(u"Images/32x32/Document_1.png"), wx.BITMAP_TYPE_ANY)},
                                                                    {"label" : _(u"Récapitulatif"), "description" : _(u"Total des prestations par activité"), "image" : wx.Bitmap(Chemins.GetStaticPath(u"Images/32x32/Document_2.png"), wx.BITMAP_TYPE_ANY)},
                                                                    ])
        self.bouton_apercu = CTRL_Bouton_image.CTRL(self, texte=_(u"Aperçu"), cheminImage="Images/32x32/Apercu.png")
        self.bouton_apercu.SetMinSize((100, -1)) 
        
        # Boutons
        self.bouton_aide = CTRL_Bouton_image.CTRL(self, texte=_(u"Aide"), cheminImage="Images/32x32/Aide.png")
        self.bouton_fermer = CTRL_Bouton_image.CTRL(self, texte=_(u"Fermer"), cheminImage="Images/32x32/Fermer.png")

        self.__set_properties()
        self.__do_layout()

        self.Bind(wx.EVT_BUTTON, self.OnBoutonFichier, self.bouton_fichier)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonApercu, self.bouton_apercu)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonAide, self.bouton_aide)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonFermer, self.bouton_fermer)
        self.Bind(wx.EVT_CLOSE, self.OnBoutonFermer) 
        
        # Init contrôles
        self.ctrl_date.SetDate(datetime.date.today())
        self.ctrl_num_role.SetValue("%02d" % datetime.date.today().month)
        self.ctrl_exercice.SetValue("%04d" % datetime.date.today().year)
        self.ctrl_code_coll.SetValue(UTILS_Parametres.Parametres(mode="get", categorie="rolmre", nom="code_col", valeur=""))
        self.ctrl_code_nat.SetValue(UTILS_Parametres.Parametres(mode="get", categorie="rolmre", nom="code_nat", valeur=""))
        self.ctrl_code_rec.SetValue(UTILS_Parametres.Parametres(mode="get", categorie="rolmre", nom="code_rec", valeur=""))

    def __set_properties(self):
        self.ctrl_date.SetToolTip(wx.ToolTip(_(u"Saisissez la date d'émission du rôle")))
        self.ctrl_code_coll.SetToolTip(wx.ToolTip(_(u"Saisissez ici le code Collectivité du rôle (ROLCOL)")))
        self.ctrl_exercice.SetToolTip(wx.ToolTip(_(u"Saisissez ici le code Exercice du rôle (ROLEX)")))
        self.ctrl_code_nat.SetToolTip(wx.ToolTip(_(u"Saisissez ici le code Nature du rôle (ROLNAT)")))
        self.ctrl_num_role.SetToolTip(wx.ToolTip(_(u"Saisissez ici le numéro de rôle du rôle (ROLROL)")))
        self.ctrl_code_rec.SetToolTip(wx.ToolTip(_(u"Saisissez ici le code Recette du rôle (ROLREC)")))
        self.bouton_fichier.SetToolTip(wx.ToolTip(_(u"Cliquez ici pour générer le fichier ROLMRE")))
        self.ctrl_type.SetToolTip(wx.ToolTip(_(u"Sélectionnez ici le type de l'impression")))
        self.bouton_apercu.SetToolTip(wx.ToolTip(_(u"Cliquez ici pour afficher le rôle au format PDF")))
        self.bouton_aide.SetToolTip(wx.ToolTip(_(u"Cliquez ici pour obtenir de l'aide")))
        self.bouton_fermer.SetToolTip(wx.ToolTip(_(u"Cliquez ici pour fermer")))
        self.SetMinSize((740, 740))

    def __do_layout(self):
        grid_sizer_base = wx.FlexGridSizer(rows=5, cols=1, vgap=10, hgap=10)
        grid_sizer_base.Add(self.ctrl_bandeau, 0, wx.EXPAND, 0)
        
        # Factures
        box_factures = wx.StaticBoxSizer(self.box_factures_staticbox, wx.VERTICAL)
        box_factures.Add(self.ctrl_factures, 1, wx.ALL|wx.EXPAND, 10)
        
        grid_sizer_base.Add(box_factures, 1, wx.LEFT|wx.RIGHT|wx.EXPAND, 10)
        
        # Paramètres
        box_parametres = wx.StaticBoxSizer(self.box_parametres_staticbox, wx.VERTICAL)
        grid_sizer_parametres = wx.FlexGridSizer(rows=2, cols=8, vgap=5, hgap=10)
        
        grid_sizer_parametres.Add(self.label_date, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0)
        grid_sizer_parametres.Add(self.ctrl_date, 0, 0, 0)
        grid_sizer_parametres.Add((20, 20), 0, wx.EXPAND, 0)
        grid_sizer_parametres.Add(self.label_num_role, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0)
        grid_sizer_parametres.Add(self.ctrl_num_role, 0, 0, 0)
        grid_sizer_parametres.Add((20, 20), 0, wx.EXPAND, 0)
        grid_sizer_parametres.Add(self.label_code_nat, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0)
        grid_sizer_parametres.Add(self.ctrl_code_nat, 0, 0, 0)

        grid_sizer_parametres.Add(self.label_exercice, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0)
        grid_sizer_parametres.Add(self.ctrl_exercice, 0, wx.EXPAND, 0)
        grid_sizer_parametres.Add((20, 20), 0, wx.EXPAND, 0)
        grid_sizer_parametres.Add(self.label_code_coll, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0)
        grid_sizer_parametres.Add(self.ctrl_code_coll, 0, 0, 0)
        grid_sizer_parametres.Add((20, 20), 0, wx.EXPAND, 0)
        grid_sizer_parametres.Add(self.label_code_rec, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0)
        grid_sizer_parametres.Add(self.ctrl_code_rec, 0, 0, 0)
        
        box_parametres.Add(grid_sizer_parametres, 1, wx.ALL|wx.EXPAND, 10)
        
        grid_sizer_base.Add(box_parametres, 1, wx.LEFT|wx.RIGHT|wx.EXPAND, 10)

        # Sortie
        grid_sizer_sortie = wx.FlexGridSizer(rows=1, cols=2, vgap=10, hgap=10)        

        box_fichier = wx.StaticBoxSizer(self.box_fichier_staticbox, wx.VERTICAL)
        box_fichier.Add(self.bouton_fichier, 1, wx.ALL|wx.EXPAND, 10)
        grid_sizer_sortie.Add(box_fichier, 1, wx.EXPAND, 0)

        box_impression = wx.StaticBoxSizer(self.box_impression_staticbox, wx.VERTICAL)
        grid_sizer_impression = wx.FlexGridSizer(rows=1, cols=4, vgap=5, hgap=5)
        grid_sizer_impression.Add(self.label_type, 0, wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL, 0)
        grid_sizer_impression.Add(self.ctrl_type, 1, wx.EXPAND|wx.ALIGN_CENTER_VERTICAL, 0)
##        grid_sizer_impression.Add((10, 10), 0, wx.EXPAND|wx.ALIGN_CENTER_VERTICAL, 0)
        grid_sizer_impression.Add(self.bouton_apercu, 0, wx.EXPAND, 0)
        grid_sizer_impression.AddGrowableCol(1)
        box_impression.Add(grid_sizer_impression, 1, wx.ALL|wx.EXPAND, 10)
        grid_sizer_sortie.Add(box_impression, 1, wx.EXPAND, 0)
        
        grid_sizer_sortie.AddGrowableCol(1)
        grid_sizer_base.Add(grid_sizer_sortie, 1, wx.LEFT|wx.RIGHT|wx.EXPAND, 10)

        # Boutons
        grid_sizer_boutons = wx.FlexGridSizer(rows=1, cols=3, vgap=10, hgap=10)
        grid_sizer_boutons.Add(self.bouton_aide, 0, 0, 0)
        grid_sizer_boutons.Add((20, 20), 0, wx.EXPAND, 0)
        grid_sizer_boutons.Add(self.bouton_fermer, 0, 0, 0)
        grid_sizer_boutons.AddGrowableCol(1)
        grid_sizer_base.Add(grid_sizer_boutons, 1, wx.LEFT|wx.RIGHT|wx.BOTTOM|wx.EXPAND, 10)
        
        self.SetSizer(grid_sizer_base)
        grid_sizer_base.Fit(self)
        grid_sizer_base.AddGrowableRow(1)
        grid_sizer_base.AddGrowableCol(0)
        self.Layout()
        self.CenterOnScreen()

    def OnBoutonAide(self, event): 
        from Utils import UTILS_Aide
        UTILS_Aide.Aide("ExportversHelios")

    def OnBoutonFermer(self, event): 
        UTILS_Parametres.Parametres(mode="set", categorie="rolmre", nom="code_col", valeur=self.ctrl_code_coll.GetValue())
        UTILS_Parametres.Parametres(mode="set", categorie="rolmre", nom="code_nat", valeur=self.ctrl_code_nat.GetValue())
        UTILS_Parametres.Parametres(mode="set", categorie="rolmre", nom="code_rec", valeur=self.ctrl_code_rec.GetValue())
        self.EndModal(wx.ID_CANCEL)

    def ValidationSaisie(self):
        """ Validation des données saisies """
        tracks = self.ctrl_factures.GetTracksCoches() 
        if len(tracks) == 0 : 
            dlg = wx.MessageDialog(self, _(u"Vous n'avez sélectionné aucune facture à inclure dans le rôle !"), _(u"Erreur"), wx.OK | wx.ICON_EXCLAMATION)
            dlg.ShowModal()
            dlg.Destroy()
            return False
        
        for track in tracks :
            if -track.solde < 0.0 :
                dlg = wx.MessageDialog(self, _(u"La facture n°%s n'est pas valide car elle comporte un montant de %.2f %s, soit inférieure à 0.\n\nVeuillez la retirer de la sélection.") % (track.numero, -track.solde, SYMBOLE), _(u"Erreur"), wx.OK | wx.ICON_EXCLAMATION)
                dlg.ShowModal()
                dlg.Destroy()
                return False
        
        date_emission = self.ctrl_date.GetDate()
        if date_emission == None :
            dlg = wx.MessageDialog(self, _(u"Vous devez saisir une date d'émission pour ce rôle !"), _(u"Erreur"), wx.OK | wx.ICON_EXCLAMATION)
            dlg.ShowModal()
            dlg.Destroy()
            self.ctrl_date.SetFocus()
            return False

        code_col = self.ctrl_code_coll.GetValue()
        if code_col == "" :
            dlg = wx.MessageDialog(self, _(u"Vous devez saisir le code Collectivité du rôle !"), _(u"Erreur"), wx.OK | wx.ICON_EXCLAMATION)
            dlg.ShowModal()
            dlg.Destroy()
            self.ctrl_code_coll.SetFocus()
            return False
        
        code_nat = self.ctrl_code_nat.GetValue()
        if code_nat == "" :
            dlg = wx.MessageDialog(self, _(u"Vous devez saisir le code Nature du rôle !"), _(u"Erreur"), wx.OK | wx.ICON_EXCLAMATION)
            dlg.ShowModal()
            dlg.Destroy()
            self.ctrl_code_nat.SetFocus()
            return False

        code_rec = self.ctrl_code_rec.GetValue()
        if code_rec == "" :
            dlg = wx.MessageDialog(self, _(u"Vous devez saisir le code Recette du rôle !"), _(u"Erreur"), wx.OK | wx.ICON_EXCLAMATION)
            dlg.ShowModal()
            dlg.Destroy()
            self.ctrl_code_rec.SetFocus()
            return False
        
        exercice = self.ctrl_exercice.GetValue()
        if exercice == "" :
            dlg = wx.MessageDialog(self, _(u"Vous devez saisir l'exercice du rôle !"), _(u"Erreur"), wx.OK | wx.ICON_EXCLAMATION)
            dlg.ShowModal()
            dlg.Destroy()
            self.ctrl_exercice.SetFocus()
            return False

        num_role = self.ctrl_num_role.GetValue()
        if num_role == "" :
            dlg = wx.MessageDialog(self, _(u"Vous devez saisir le numéro de rôle !"), _(u"Erreur"), wx.OK | wx.ICON_EXCLAMATION)
            dlg.ShowModal()
            dlg.Destroy()
            self.ctrl_num_role.SetFocus()
            return False

        return True

    def OnBoutonFichier(self, event): 
        if self.ValidationSaisie() == False :
            return
        
        # Récupération des paramètres
        tracks = self.ctrl_factures.GetTracksCoches() 
        date_emission = self.ctrl_date.GetDate()
        code_col = self.ctrl_code_coll.GetValue()
        code_nat = self.ctrl_code_nat.GetValue()
        code_rec = self.ctrl_code_rec.GetValue()
        exercice = self.ctrl_exercice.GetValue()
        num_role = self.ctrl_num_role.GetValue()
        
        listeLignes = []
        for track in tracks :
            
            if track.prelevement == True :
                prelevement = True
                prelevement_etab = track.prelevement_etab
                prelevement_guichet = track.prelevement_guichet
                prelevement_compte = track.prelevement_numero
                prelevement_cle = track.prelevement_cle
                prelevement_titulaire = track.prelevement_payeur
            else :
                prelevement = False
                prelevement_etab = ""
                prelevement_guichet = ""
                prelevement_compte = ""
                prelevement_cle = ""
                prelevement_titulaire = ""
            
            if track.adresse_famille["rue"] != None : rue = track.adresse_famille["rue"]
            else : rue = u""
            if track.adresse_famille["cp"] != None : cp = track.adresse_famille["cp"]
            else : cp = u""
            if track.adresse_famille["ville"] != None : ville = track.adresse_famille["ville"]
            else : ville = u""
                
                
            dictDonnees = {
                "ROLCOL" : code_col, # Code Collectivité
                "ROLNAT" : code_nat, # Nature du rôle
                "ROLEX" : exercice, # Exercice
                "ROLREC" : code_rec, # Code Recette
                "ROLROL" : num_role, # Numéro de rôle
                "date_edition" : date_emission, # Date d'édition
                
                "ROLDET" : track.numero, # Numéro de dette
                "ROLEAU" : int(str(FloatToDecimal(-track.solde)).replace(".", "")), # Montant de la facture en centimes
                
                "nom" : track.nomsTitulaires, # Nom du débiteur
                "rue" : rue, # Rue de résidence du débiteur
                "code_postal" : cp, # Code postal de la ville de résidence du débiteur
                "ville" : ville, # Nom de la ville de résidence du débiteur
                "objet" : _(u"Facture n°%s") % track.numero, # Objet de la recette (64 caract max)
                
                "prelevement" : prelevement, # Activation du prélèvement
                "prelevement_etab" : prelevement_etab, # Code établissement
                "prelevement_guichet" : prelevement_guichet, # Code Guichet
                "prelevement_compte" : prelevement_compte, # Numéro de compte
                "prelevement_cle" : prelevement_cle, # Clé RIB
                "prelevement_titulaire" : prelevement_titulaire, # Nom titulaire du compte
                }
            
            ligne = UTILS_Helios.GetLigne(dictDonnees)
            listeLignes.append(ligne)
        
        # Finalisation du texte
        texte = "".join(listeLignes)
    
        # Demande à l'utilisateur le nom de fichier et le répertoire de destination
        nomFichier = "Rolmre.txt"
        wildcard = "Fichier texte (*.txt)|*.txt|" \
                        "All files (*.*)|*.*"
        sp = wx.StandardPaths.Get()
        cheminDefaut = sp.GetDocumentsDir()
        dlg = wx.FileDialog(
            None, message = _(u"Veuillez sélectionner le répertoire de destination et le nom du fichier"), defaultDir=cheminDefaut, 
            defaultFile = nomFichier, 
            wildcard = wildcard, 
            style = wx.FD_SAVE
            )
        dlg.SetFilterIndex(0)
        if dlg.ShowModal() == wx.ID_OK:
            cheminFichier = dlg.GetPath()
            dlg.Destroy()
        else:
            dlg.Destroy()
            return
        
        # Le fichier de destination existe déjà :
        if os.path.isfile(cheminFichier) == True :
            dlg = wx.MessageDialog(None, _(u"Un fichier portant ce nom existe déjà. \n\nVoulez-vous le remplacer ?"), "Attention !", wx.YES_NO | wx.NO_DEFAULT | wx.ICON_EXCLAMATION)
            if dlg.ShowModal() == wx.ID_NO :
                return False
                dlg.Destroy()
            else:
                dlg.Destroy()

        # Création du fichier texte
        f = open(cheminFichier, "w")
        f.write(texte.encode("iso-8859-15"))
        f.close()
        
        # Confirmation de création du fichier et demande d'ouverture directe dans Excel
        txtMessage = _(u"Le fichier a été créé avec succès.\n\nSouhaitez-vous l'ouvrir dès maintenant ?")
        dlgConfirm = wx.MessageDialog(None, txtMessage, _(u"Confirmation"), wx.YES_NO|wx.NO_DEFAULT|wx.ICON_QUESTION)
        reponse = dlgConfirm.ShowModal()
        dlgConfirm.Destroy()
        if reponse == wx.ID_NO:
            return
        else:
            FonctionsPerso.LanceFichierExterne(cheminFichier)

    def OnBoutonApercu(self, event): 
        if self.ValidationSaisie() == False :
            return
        
        typeImpression = self.ctrl_type.GetType() 
        
        # Récupération des paramètres
        tracks = self.ctrl_factures.GetTracksCoches() 
        date_emission = self.ctrl_date.GetDate()
        code_col = self.ctrl_code_coll.GetValue()
        code_nat = self.ctrl_code_nat.GetValue()
        code_rec = self.ctrl_code_rec.GetValue()
        exercice = self.ctrl_exercice.GetValue()
        num_role = self.ctrl_num_role.GetValue()
        
        listeIDfactures = []
        montantTotal = 0.0 
        for track in tracks :
            listeIDfactures.append(track.IDfacture)
            montantTotal += -track.solde

        if len(listeIDfactures) == 0 : conditionFactures = "()"
        elif len(listeIDfactures) == 1 : conditionFactures = "(%d)" % listeIDfactures[0]
        else : conditionFactures = str(tuple(listeIDfactures))

        DB = GestionDB.DB() 
        req = """
        SELECT prestations.IDprestation, prestations.IDfacture, prestations.label, prestations.montant, 
        prestations.IDindividu, individus.nom, individus.prenom,
        prestations.IDactivite, activites.nom
        FROM prestations
        LEFT JOIN individus ON prestations.IDindividu = individus.IDindividu
        LEFT JOIN activites ON activites.IDactivite = prestations.IDactivite
        WHERE prestations.IDfacture IN %s
        GROUP BY prestations.IDprestation
        ORDER BY prestations.date
        ;""" % conditionFactures
        DB.ExecuterReq(req)
        listePrestations = DB.ResultatReq() 
        DB.Close() 
        dictPrestations = {}
        dictIndividus = {}
        dictActivites = {}
        dictTotaux = {}
        for IDprestation, IDfacture, label, montant, IDindividu, nom, prenom, IDactivite, nomActivite in listePrestations :

            if dictActivites != None and dictActivites.has_key(IDactivite) == False :
                dictActivites[IDactivite] = nomActivite

            if IDindividu != None and dictIndividus.has_key(IDindividu) == False and prenom != None :
                dictIndividus[IDindividu] = u"%s %s" % (nom, prenom)
            
            if dictPrestations.has_key(IDfacture) == False :
                dictPrestations[IDfacture] = {}
            if dictPrestations[IDfacture].has_key(IDindividu) == False :
                dictPrestations[IDfacture][IDindividu] = {}
            if dictPrestations[IDfacture][IDindividu].has_key(label) == False :
                dictPrestations[IDfacture][IDindividu][label] = {"quantite" : 0, "montant" : 0.0, "IDactivite" : IDactivite}
            
            if dictTotaux.has_key(IDactivite) == False :
                dictTotaux[IDactivite] = {}
            if dictTotaux[IDactivite].has_key(label) == False :
                dictTotaux[IDactivite][label] = {"quantite" : 0, "montant" : 0.0}
            
            dictTotaux[IDactivite][label]["quantite"] += 1
            dictTotaux[IDactivite][label]["montant"] += montant

            dictPrestations[IDfacture][IDindividu][label]["quantite"] += 1
            dictPrestations[IDfacture][IDindividu][label]["montant"] += montant

        # Création du PDF
        from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, PageBreak
        from reportlab.platypus.flowables import ParagraphAndImage, Image
        from reportlab.rl_config import defaultPageSize
        from reportlab.lib.units import inch, cm
        from reportlab.lib.utils import ImageReader
        from reportlab.lib import colors
        from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
        self.hauteur_page = defaultPageSize[1]
        self.largeur_page = defaultPageSize[0]
        
        # Initialisation du PDF
        PAGE_WIDTH, PAGE_HEIGHT=defaultPageSize
        nomDoc = FonctionsPerso.GenerationNomDoc("ROLMRE", "pdf")
        if sys.platform.startswith("win") : nomDoc = nomDoc.replace("/", "\\")
        doc = SimpleDocTemplate(nomDoc, topMargin=30, bottomMargin=30)
        story = []
        
        largeurContenu = 520
        
        # Création du titre du document
        def Header():
            dataTableau = []
            largeursColonnes = ( (420, 100) )
            dateDuJour = UTILS_Dates.DateEngFr(str(datetime.date.today()))
            dataTableau.append( (_(u"Rôle n°%s-%s") % (exercice, num_role), _(u"%s\nEdité le %s") % (UTILS_Organisateur.GetNom(), dateDuJour)) )
            style = TableStyle([
                    ('BOX', (0,0), (-1,-1), 0.25, colors.black), 
                    ('VALIGN', (0,0), (-1,-1), 'TOP'), 
                    ('ALIGN', (0,0), (0,0), 'LEFT'), 
                    ('FONT',(0,0),(0,0), "Helvetica-Bold", 16), 
                    ('ALIGN', (1,0), (1,0), 'RIGHT'), 
                    ('FONT',(1,0),(1,0), "Helvetica", 6), 
                    ])
            tableau = Table(dataTableau, largeursColonnes)
            tableau.setStyle(style)
            story.append(tableau)
            story.append(Spacer(0, 20))       
        
        # Insère un header
        Header() 
        
        couleurFond1 = (0.8, 0.8, 1) # Vert -> (0.5, 1, 0.2)
        couleurFond2 = (0.9, 0.9, 1) # Vert -> (0.5, 1, 0.2)
        styleLabel = ParagraphStyle(name="label", fontName="Helvetica", alignment=1, fontSize=5, spaceAfter=0, leading=8, spaceBefore=0)
        styleTexte = ParagraphStyle(name="label", fontName="Helvetica", alignment=0, fontSize=7, spaceAfter=0, leading=8, spaceBefore=0)
        styleTexte2 = ParagraphStyle(name="label", fontName="Helvetica", alignment=1, fontSize=7, spaceAfter=0, leading=8, spaceBefore=0)
        styleMontant = ParagraphStyle(name="label", fontName="Helvetica", alignment=2, fontSize=7, spaceAfter=0, leading=8, spaceBefore=0)

        # Intro
        story.append(Paragraph(_(u"Date d'émission : %s | Code Collectivité : %s | Code Nature : %s | Code Recette : %s") % (UTILS_Dates.DateDDEnFr(date_emission), code_col, code_nat, code_rec), styleTexte))
        story.append(Spacer(0, 20))
        
        # Factures
        if typeImpression in ("detail", "simple") :
            
            for track in tracks :
                
                # Numéro de facture
                dataTableau = []
                largeursColonnes = [100, 100, largeurContenu-100-100]
                dataTableau.append((
                    _(u"Facture n°%s") % track.numero, 
                    u"%.2f %s" % (-track.solde, SYMBOLE),
                    _(u"Edité le %s | Echéance le %s | Période du %s au %s") % (UTILS_Dates.DateDDEnFr(track.date_edition), UTILS_Dates.DateDDEnFr(track.date_echeance), UTILS_Dates.DateDDEnFr(track.date_debut), UTILS_Dates.DateDDEnFr(track.date_fin)),
                    ))
                tableau = Table(dataTableau, largeursColonnes)
                listeStyles = [
                    ('FONT', (0, 0), (1, -1), "Helvetica-Bold", 7),
                    ('FONT', (2, -1), (2, -1), "Helvetica", 6),
                    ('BACKGROUND', (0, 0), (-1, -1), couleurFond1),
                    ('ALIGN', (2, -1), (2, -1), 'RIGHT'),
                    ('BOX', (0, 0), (-1, -1), 0.25, colors.black),
                    ]
                tableau.setStyle(TableStyle(listeStyles))
                story.append(tableau)
                
                # Famille
                if track.prelevement == True :
                    textePrelevement = _(u"N° Compte : %s | Etab : %s | Guichet : %s | Clé : %s | Titulaire : %s") % (track.prelevement_numero, track.prelevement_etab, track.prelevement_guichet, track.prelevement_cle, track.prelevement_payeur)
                else :
                    textePrelevement = u""
                
                if track.adresse_famille["rue"] != None : rue = track.adresse_famille["rue"]
                else : rue = u""
                if track.adresse_famille["cp"] != None : cp = track.adresse_famille["cp"]
                else : cp = u""
                if track.adresse_famille["ville"] != None : ville = track.adresse_famille["ville"]
                else : ville = u""
                
                dataTableau = [(Paragraph(_(u"Famille"), styleLabel), Paragraph(_(u"Adresse"), styleLabel), Paragraph(_(u"Prélèvement bancaire"), styleLabel)),]
                largeursColonnes = [180, 140, largeurContenu-320]
                dataTableau.append((
                    Paragraph(track.nomsTitulaires, styleTexte), 
                    (Paragraph(rue, styleTexte), Paragraph(u"%s %s" % (cp, ville), styleTexte)),
                    Paragraph(textePrelevement, styleTexte),
                    ))
                tableau = Table(dataTableau, largeursColonnes)
                listeStyles = [
                    ('TOPPADDING', (0, 0), (-1, 0), 0), 
                    ('BOTTOMPADDING',(0, 0), (-1, 0), -1), 
                    ('FONT', (0, -1), (-1, -1), "Helvetica", 7),
                    ('GRID', (0, 0), (-1, 0), 0.25, colors.black),
                    ('BOX', (0, 1), (-1, 1), 0.25, colors.black),
                    ('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
                    ('BACKGROUND', (0, 0), (-1, 0), couleurFond2),
                    ]
                tableau.setStyle(TableStyle(listeStyles))
                story.append(tableau)
                
                # Détail des prestations
                if typeImpression == "detail" and dictPrestations.has_key(track.IDfacture) :
                    
                    dataTableau = [(Paragraph(_(u"Individu"), styleLabel), Paragraph(_(u"Activité"), styleLabel), Paragraph(_(u"Prestation"), styleLabel), Paragraph(_(u"Quantité"), styleLabel), Paragraph(_(u"Montant total"), styleLabel)),]
                    largeursColonnes = [130, 120, 185, 35, 50]
                    
                    for IDindividu, dictLabels in dictPrestations[track.IDfacture].iteritems() :
                        
                        if dictIndividus.has_key(IDindividu) :
                            labelIndividu = dictIndividus[IDindividu]
                        else :
                            labelIndividu = u""

                        listeActivites = []
                        listeLabels = []
                        listeQuantites = []
                        listeMontants = []
                        for labelPrestation, dictTemp in dictLabels.iteritems() :

                            if dictTemp["IDactivite"] != None and dictActivites.has_key(dictTemp["IDactivite"]) :
                                labelActivite = dictActivites[dictTemp["IDactivite"]]
                            else :
                                labelActivite = u""
                            
                            listeActivites.append(Paragraph(labelActivite[:35], styleTexte2)) 
                            listeLabels.append(Paragraph(labelPrestation[:40], styleTexte2)) 
                            listeQuantites.append(Paragraph(str(dictTemp["quantite"]), styleTexte2)) 
                            listeMontants.append(Paragraph(u"%.2f %s" % (dictTemp["montant"], SYMBOLE), styleMontant))
                        
                        dataTableau.append((
                            Paragraph(labelIndividu, styleTexte2), 
                            listeActivites,
                            listeLabels,
                            listeQuantites,
                            listeMontants,
                            ))
                            
                    tableau = Table(dataTableau, largeursColonnes)
                    listeStyles = [
                        ('TOPPADDING', (0, 0), (-1, 0), 0), 
                        ('BOTTOMPADDING',(0, 0), (-1, 0), -1), 
                        ('FONT', (0, -1), (-1, -1), "Helvetica", 7),
                        ('GRID', (0, 0), (-1, -1), 0.25, colors.black),
                        ('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
                        ('BACKGROUND', (0, 0), (-1, 0), couleurFond2),
                        ]
                    tableau.setStyle(TableStyle(listeStyles))
                    story.append(tableau)
                    
                story.append(Spacer(0, 10))
        
        # Totaux        
        dictTotaux[IDactivite][label]["montant"]

        dataTableau = [
            (_(u"Totaux par activités et prestations"), "", "", ""),
            (Paragraph(_(u"Activités"), styleLabel), Paragraph(_(u"Prestations"), styleLabel), Paragraph(_(u"Quantité"), styleLabel), Paragraph(_(u"Montant"), styleLabel)),
            ]
        largeursColonnes = [200, 240, 30, 50]

        for IDactivite, dictLabels in dictTotaux.iteritems() :
            
            if IDactivite == None :
                nomActivite = _(u"Prestations diverses")
            else :
                nomActivite = dictActivites[IDactivite]
                
            listeLabels = []
            listeQuantites = []
            listeMontants = []
            quantiteActivite = 0
            totalActivite = 0.0
            for label, dictTemp in dictLabels.iteritems() :
                listeLabels.append(Paragraph(label, styleTexte2)) 
                listeQuantites.append(Paragraph(str(dictTemp["quantite"]), styleTexte2)) 
                listeMontants.append(Paragraph(u"%.2f %s" % (dictTemp["montant"], SYMBOLE), styleMontant))
                quantiteActivite += dictTemp["quantite"]
                totalActivite += dictTemp["montant"]
            
            listeLabels.append(Paragraph(_(u"<b><i>Total de l'activité</i></b>"), styleTexte2)) 
            listeQuantites.append(Paragraph("<b><i>%d</i></b>" % quantiteActivite, styleTexte2)) 
            listeMontants.append(Paragraph(u"<b><i>%.2f %s</i></b>" % (totalActivite, SYMBOLE), styleMontant))
            
            dataTableau.append((
                Paragraph(nomActivite, styleTexte2), 
                listeLabels,
                listeQuantites,
                listeMontants,
                ))

        tableau = Table(dataTableau, largeursColonnes)
        listeStyles = [
            ('TOPPADDING', (0, 1), (-1, 1), 0), 
            ('BOTTOMPADDING',(0, 1), (-1, 1), -1), 
            ('FONT', (1, -1), (-1, -1), "Helvetica", 7),
            ('FONT', (0, 0), (0, 0), "Helvetica-Bold", 7),
            ('BOX', (0, 0), (-1, 0), 0.25, colors.black),
            ('GRID', (0, 1), (-1, -1), 0.25, colors.black),
            ('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
            ('BACKGROUND', (0, 0), (-1, 0), couleurFond1),
            ('BACKGROUND', (0, 1), (-1, 1), couleurFond2),
            ]
        tableau.setStyle(TableStyle(listeStyles))
        story.append(tableau)

        story.append(Spacer(0, 10))

        story.append(Paragraph(_(u"%d factures | Montant total : %.2f %s") % (len(tracks), montantTotal, SYMBOLE), styleTexte))

        # Enregistrement et ouverture du PDF
        try :
            doc.build(story)
        except Exception, err :
            print "Erreur dans ouverture PDF :", err
            if "Permission denied" in err :
                dlg = wx.MessageDialog(None, _(u"Noethys ne peut pas créer le PDF.\n\nVeuillez vérifier qu'un autre PDF n'est pas déjà ouvert en arrière-plan..."), _(u"Erreur d'édition"), wx.OK | wx.ICON_ERROR)
                dlg.ShowModal()
                dlg.Destroy()
                return False

        FonctionsPerso.LanceFichierExterne(nomDoc)
Esempio n. 15
0
    def Apercu(self):
        """ Impression tableau de données """
        if self.GetNumberRows() == 0 or self.GetNumberCols() == 0:
            dlg = wx.MessageDialog(self, _(u"Il n'y a rien à imprimer !"),
                                   "Erreur", wx.OK | wx.ICON_EXCLAMATION)
            dlg.ShowModal()
            dlg.Destroy()
            return None

        avecCouleurs = True

        from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle
        from reportlab.lib.pagesizes import A4
        from reportlab.lib import colors
        from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle

        def ConvertCouleur(couleur):
            r, g, b = couleur
            return r / 255.0, g / 255.0, b / 255.0

        # Récupération des données du tableau
        tableau = self
        nbreColonnes = tableau.GetNumberCols()
        nbreLignes = tableau.GetNumberRows()

        # Initialisation du tableau
        story = []
        dataTableau = []
        listeCouleurs = []

        # Création des colonnes
        largeursColonnes = []
        largeurColonne = 33
        largeurColonneLabel = 90
        for col in range(0, nbreColonnes + 1):
            if col == 0: largeursColonnes.append(largeurColonneLabel)
            else: largeursColonnes.append(largeurColonne)

        listeStyles = [
            ('GRID', (0, 0), (-1, -1), 0.25,
             colors.black),  # Crée la bordure noire pour tout le tableau
            ('VALIGN', (0, 0), (-1, -1),
             'MIDDLE'),  # Centre verticalement toutes les cases
            ('ALIGN', (0, 0), (-1, 0),
             'CENTRE'),  # Centre les labels de colonne
            ('ALIGN', (1, 1), (-1, -1), 'CENTRE'),  # Valeurs à gauche
            ('ALIGN', (0, 1), (0, -1),
             'CENTRE'),  # Colonne Label Ligne centrée
            (
                'FONT', (0, 0), (-1, -1), "Helvetica", 6
            ),  # Donne la police de caract. + taille de police de la ligne de total
            (
                'FONT', (0, 0), (-1, 0), "Helvetica-Bold", 6
            ),  # Donne la police de caract. + taille de police de la ligne de total
        ]

        # Création de l'entete
        valeursLigne = [
            "",
        ]
        for numColonne in range(0, nbreColonnes):
            labelColonne = tableau.GetColLabelValue(numColonne)
            valeursLigne.append(labelColonne)
        dataTableau.append(valeursLigne)

        # Création des lignes
        for numLigne in range(0, nbreLignes):
            labelLigne = tableau.GetRowLabelValue(numLigne)
            valeursLigne = [
                labelLigne,
            ]
            for numCol in range(0, nbreColonnes):
                valeurCase = tableau.GetCellValue(numLigne, numCol)
                couleurCase = tableau.GetCellBackgroundColour(numLigne, numCol)
                if couleurCase != (255, 255, 255,
                                   255) and avecCouleurs == True:
                    r, g, b = ConvertCouleur(couleurCase)
                    listeStyles.append(
                        ('BACKGROUND', (numCol + 1, numLigne + 1),
                         (numCol + 1, numLigne + 1), (r, g, b)))
                if numLigne == 0:
                    valeurCase = valeurCase.replace(" ", "\n")
                valeursLigne.append(valeurCase)
            dataTableau.append(valeursLigne)

        # Style du tableau
        style = TableStyle(listeStyles)

        # Création du tableau
        tableau = Table(dataTableau, largeursColonnes, hAlign='LEFT')
        tableau.setStyle(style)
        story.append(tableau)
        story.append(Spacer(0, 20))

        # Calcul du format de la page
        tailleMarge = 20
        if sum(largeursColonnes) > A4[0] - (tailleMarge * 2):
            hauteur, largeur = A4
        else:
            largeur, hauteur = A4

        # Création du titre du document
        dataTableau = []
        largeurContenu = largeur - (tailleMarge * 2)
        largeursColonnes = ((largeurContenu - 100, 100))
        dateDuJour = DateEngFr(str(datetime.date.today()))
        dataTableau.append(
            (_(u"Synthèse des consommations"), _(u"%s\nEdité le %s") %
             (UTILS_Organisateur.GetNom(), dateDuJour)))
        style = TableStyle([
            ('BOX', (0, 0), (-1, -1), 0.25, colors.black),
            ('VALIGN', (0, 0), (-1, -1), 'TOP'),
            ('ALIGN', (0, 0), (0, 0), 'LEFT'),
            ('FONT', (0, 0), (0, 0), "Helvetica-Bold", 16),
            ('ALIGN', (1, 0), (1, 0), 'RIGHT'),
            ('FONT', (1, 0), (1, 0), "Helvetica", 6),
        ])
        tableau = Table(dataTableau, largeursColonnes)
        tableau.setStyle(style)
        story.insert(0, tableau)
        story.insert(1, Spacer(0, 10))

        # Insertion du label Paramètres
        styleA = ParagraphStyle(name="A",
                                fontName="Helvetica",
                                fontSize=6,
                                spaceAfter=20)
        story.insert(2, Paragraph(self.labelParametres, styleA))

        # Enregistrement du PDF
        nomDoc = FonctionsPerso.GenerationNomDoc("SYNTHESE_CONSO", "pdf")
        if sys.platform.startswith("win"): nomDoc = nomDoc.replace("/", "\\")
        doc = SimpleDocTemplate(nomDoc,
                                pagesize=(largeur, hauteur),
                                leftMargin=tailleMarge,
                                rightMargin=tailleMarge,
                                topMargin=tailleMarge,
                                bottomMargin=tailleMarge)
        doc.build(story)

        # Affichage du PDF
        FonctionsPerso.LanceFichierExterne(nomDoc)
Esempio n. 16
0
class CTRL(HTL.HyperTreeList):
    def __init__(self, parent): 
        HTL.HyperTreeList.__init__(self, parent, -1)
        self.parent = parent
        self.dictImpression = {}
        
        # Paramètres
        self.mode_affichage = "mois" # "mois", "annee"
        self.affichage_details = True
        self.type = "depots"
        self.date_debut = None
        self.date_fin = None
        self.listeActivites = []
        self.listeDepots = []
        
##        # Création de l'ImageList
##        il = wx.ImageList(16, 16)
##        self.img_ok = il.Add(wx.Bitmap(Chemins.GetStaticPath('Images/16x16/Ok.png'), wx.BITMAP_TYPE_PNG))
##        self.img_pasok = il.Add(wx.Bitmap(Chemins.GetStaticPath('Images/16x16/Interdit.png'), wx.BITMAP_TYPE_PNG))
##        self.AssignImageList(il)
        
        # wx.TR_COLUMN_LINES |  | wx.TR_HAS_BUTTONS
        self.SetBackgroundColour(wx.WHITE)
        if 'phoenix' in wx.PlatformInfo:
            TR_COLUMN_LINES = HTL.TR_COLUMN_LINES
        else :
            TR_COLUMN_LINES = wx.TR_COLUMN_LINES
        self.SetAGWWindowStyleFlag(wx.TR_HIDE_ROOT  | wx.TR_ROW_LINES | TR_COLUMN_LINES | wx.TR_HAS_BUTTONS | wx.TR_HAS_VARIABLE_ROW_HEIGHT | wx.TR_FULL_ROW_HIGHLIGHT ) # HTL.TR_NO_HEADER
    
    def SetModeAffichage(self, mode="depots"):
        self.mode_affichage = mode
    
    def SetAffichageDetails(self, etat=True):
        self.affichage_details = etat
        
    def SetTypeDepots(self, listeDepots=[]):
        self.type = "depots"
        self.listeDepots = listeDepots
        
    def SetTypePrestations(self, date_debut=None, date_fin=None, listeActivites=[]):
        self.type = "prestations"
        self.date_debut = date_debut
        self.date_fin = date_fin
        self.listeActivites = listeActivites

    def SetTypeVide(self):
        self.type = "vide"

    def Importation_depots(self):
        """ Importation des données """
        DB = GestionDB.DB()
        
        if len(self.listeDepots) == 0 : conditionDepots = "()"
        elif len(self.listeDepots) == 1 : conditionDepots = "(%d)" % self.listeDepots[0]
        else : conditionDepots = str(tuple(self.listeDepots))
        
        req = """SELECT depots.IDdepot, depots.date, nom, verrouillage, depots.IDcompte,
        SUM(reglements.montant)
        FROM depots
        LEFT JOIN reglements ON reglements.IDdepot = depots.IDdepot
        WHERE depots.IDdepot IN %s
        GROUP BY depots.IDdepot
        ORDER BY depots.date
        ;""" % conditionDepots
        DB.ExecuterReq(req)
        listeDonnees = DB.ResultatReq()
        dictDepots = {}
        for IDdepot, date, nom, verrouillage, IDcompte, montantTotal in listeDonnees :
            date = UTILS_Dates.DateEngEnDateDD(date)
            if montantTotal == None : montantTotal = 0.0
            dictDepots[IDdepot] = {"date":date, "nom":nom, "verrouillage":verrouillage, "IDcompte":IDcompte, "montantTotal":montantTotal}
        
        DB.Close() 
        return dictDepots

    def Importation_ventilation(self):
        """ Importation des données """
        DB = GestionDB.DB()
        
        if self.type == "depots" :
            # Type Dépôts
            if len(self.listeDepots) == 0 : condition = "depots.IDdepot IN ()"
            elif len(self.listeDepots) == 1 : condition = "depots.IDdepot IN (%d)" % self.listeDepots[0]
            else : condition = "depots.IDdepot IN %s" % str(tuple(self.listeDepots))
        else:
            # Type Prestations
            if len(self.listeActivites) == 0 : conditionActivites = ""
            elif len(self.listeActivites) == 1 : conditionActivites = "AND prestations.IDactivite=%d" % self.listeActivites[0]
            else : conditionActivites = "AND prestations.IDactivite IN %s" % str(tuple(self.listeActivites))
            condition = "prestations.date>='%s' AND prestations.date<='%s' %s" % (self.date_debut, self.date_fin, conditionActivites)
                            
        # Récupèration de la ventilation des prestations des dépôts
        req = """SELECT 
        ventilation.IDventilation, ventilation.IDreglement, ventilation.IDprestation, ventilation.montant,
        reglements.date, reglements.date_saisie, depots.IDdepot, depots.date,
        prestations.date, prestations.label, prestations.IDactivite, activites.nom, activites.abrege
        FROM ventilation
        LEFT JOIN reglements ON reglements.IDreglement = ventilation.IDreglement
        LEFT JOIN prestations ON prestations.IDprestation = ventilation.IDprestation
        LEFT JOIN depots ON depots.IDdepot = reglements.IDdepot
        LEFT JOIN activites ON activites.IDactivite = prestations.IDactivite
        WHERE %s
        ORDER BY prestations.date; """ % condition
        DB.ExecuterReq(req)
        listeVentilation = DB.ResultatReq()
        dictVentilation = {}
        listePeriodes = []
        dictIDreglements = {}
        for IDventilation, IDreglement, IDprestation, montantVentilation, dateReglement, dateSaisieReglement, IDdepot, dateDepotReglement, datePrestation, labelPrestation, IDactivite, nomActivite, abregeActivite in listeVentilation :
            dateReglement = UTILS_Dates.DateEngEnDateDD(dateReglement)
            dateSaisieReglement = UTILS_Dates.DateEngEnDateDD(dateSaisieReglement)
            dateDepotReglement = UTILS_Dates.DateEngEnDateDD(dateDepotReglement)
            datePrestation = UTILS_Dates.DateEngEnDateDD(datePrestation)
            
            # Compte le nombre de règlements dans chaque dépôt
            if dictIDreglements.has_key(IDdepot) == False :
                dictIDreglements[IDdepot] = []
            if IDreglement not in dictIDreglements[IDdepot] :
                dictIDreglements[IDdepot].append(IDreglement)
            
            # Rajoute le nom de l'activité dans le label de la prestation
            if nomActivite != None :
                labelPrestation = u"%s - %s" % (nomActivite, labelPrestation)
            
            # Retient la période de ventilation
            if datePrestation != None :
                annee = datePrestation.year
                mois = datePrestation.month
                if self.mode_affichage == "mois" :
                    periode = (annee, mois)
                else:
                    periode = annee
                
                if periode not in listePeriodes :
                    listePeriodes.append(periode)
                    
                if dictVentilation.has_key(IDdepot) == False :
                    dictVentilation[IDdepot] = {}
                if dictVentilation[IDdepot].has_key(periode) == False :
                    dictVentilation[IDdepot][periode] = {}
                if dictVentilation[IDdepot][periode].has_key(labelPrestation) == False :
                    dictVentilation[IDdepot][periode][labelPrestation] = 0.0
                dictVentilation[IDdepot][periode][labelPrestation] += montantVentilation
        
        DB.Close() 
        listePeriodes.sort()
        
        return dictVentilation, listePeriodes, dictIDreglements
    
    def CreationColonnes(self, listePeriodes=[]):
        """ Création des colonnes """
        # Création de la première colonne
        self.AddColumn(_(u"Dépôts"))
        self.SetColumnWidth(0, 270)
        self.SetColumnAlignment(0, wx.ALIGN_LEFT)
        
        # Création des colonnes périodes
        numColonne = 1
        if self.mode_affichage == "mois" :
            # Mode affichage MOIS
            for annee, mois in listePeriodes :
                self.AddColumn(PeriodeComplete(mois, annee))
                self.SetColumnWidth(numColonne, 65)
                self.SetColumnAlignment(numColonne, wx.ALIGN_CENTRE)
                numColonne += 1
        else:
            # Mode affichage ANNEE
            for annee in listePeriodes :
                self.AddColumn(str(annee))
                self.SetColumnWidth(numColonne, 65)
                self.SetColumnAlignment(numColonne, wx.ALIGN_CENTRE)
                numColonne += 1

        # Création de la colonne Non Ventilé
        if self.type == "depots" :
            self.AddColumn(_(u"Non ventilé"))
            self.SetColumnWidth(numColonne, 65)
            self.SetColumnAlignment(numColonne, wx.ALIGN_CENTRE)
            numColonne += 1

        # Création de la colonne Total
        self.AddColumn(_(u"Total"))
        self.SetColumnWidth(numColonne, 75)
        self.SetColumnAlignment(numColonne, wx.ALIGN_CENTRE)
        
    def MAJ(self):        
        """ Remplissage du ctrl """
        if self.type == "vide" :
            self.RAZ()
            return

        # Importation des données
        dictVentilation, listePeriodes, dictIDreglements = self.Importation_ventilation() 
        if self.type == "prestations" :
            self.listeDepots = dictVentilation.keys()
            if None in self.listeDepots : self.listeDepots.remove(None)
        dictDepots = self.Importation_depots()
        
        # Si on est en type PRESTATIONS, on crée un dépôt virtuel pour les règlements non déposées
        if self.type == "prestations" and dictVentilation.has_key(None) :
            dictDepots[None] = {"date":datetime.date(1977, 1, 1), "nom":_(u"----- %d règlements non déposés -----") % len(dictIDreglements[None]), "verrouillage":False, "IDcompte":None, "montantTotal":0.0}
        
        self.dictImpression = { "entete" : [], "contenu" : [], "total" : [], "coloration" : [] }
        
        # Mémorisation des colonnes
        dictColonnes = {}
        index = 1
        self.dictImpression["entete"].append(_(u"Dépôts"))
        for periode in listePeriodes :
            dictColonnes[periode] = index
            if self.mode_affichage == "mois" :
                label = PeriodeComplete(periode[1], periode[0])
            else:
                label = str(periode)
            self.dictImpression["entete"].append(label)
            index += 1
        if self.type == "depots" :
            dictColonnes["sansVentilation"] = index
            self.dictImpression["entete"].append(_(u"Non ventilé"))
            index += 1
        dictColonnes["total"] = index
        self.dictImpression["entete"].append(_(u"Total"))
        
        # Initialisation du CTRL
        self.RAZ() 
        self.CreationColonnes(listePeriodes) 
        self.root = self.AddRoot(_(u"Racine"))
    
        # Création des branches
        
        # ------------------ Branches DEPOTS -----------------
        
        # Tri des dépôts par date de dépôt
        listeDepotsTemp = []
        for IDdepot, dictDepot in dictDepots.iteritems() :
            if dictDepot["date"] == None :
                dateDepot = datetime.date(1977, 1, 1)
            else:
                dateDepot = dictDepot["date"] 
            listeDepotsTemp.append( (dateDepot, IDdepot, dictDepot) )
        listeDepotsTemp.sort()
        
        dictLigneTotal = {}
        totalSansVentilation = 0.0
        
        for dateDepot, IDdepot, dictDepot in listeDepotsTemp :
            if dateDepot == datetime.date(1977, 1, 1) : 
                dateStr = _(u"Sans date de dépôt")
            else:
                dateStr = u"%02d/%02d/%04d" % (dateDepot.day, dateDepot.month, dateDepot.year)
            label = u"%s (%s - %.2f %s)" % (dictDepot["nom"], dateStr, dictDepot["montantTotal"], SYMBOLE)
            if IDdepot == None : label = dictDepot["nom"]
            niveauDepot = self.AppendItem(self.root, label)
                        
            impressionLigne = [label,] 
            if self.affichage_details == True :
                self.dictImpression["coloration"].append(len(self.dictImpression["contenu"]))
                        
            # Colonnes périodes
            totalLigne = 0.0
            for periode in listePeriodes :
                if dictVentilation.has_key(IDdepot) and dictVentilation[IDdepot].has_key(periode) :
                    valeur = 0.0
                    for labelPrestation, montantVentilation in dictVentilation[IDdepot][periode].iteritems() : 
                        valeur += montantVentilation
                    totalLigne += valeur
                    texte = u"%.2f %s" % (valeur, SYMBOLE)
                    self.SetItemText(niveauDepot, texte, dictColonnes[periode])
                    impressionLigne.append(texte)
                else:
                    impressionLigne.append("")
                           
            # Colonne NON VENTILE
            if self.type == "depots" :
                totalDepot = dictDepots[IDdepot]["montantTotal"]
                sansVentilation = totalDepot - totalLigne
                if sansVentilation != 0.0 :
                    totalLigne += sansVentilation
                    totalSansVentilation += sansVentilation
                    texte = u"%.2f %s" % (sansVentilation, SYMBOLE)
                    self.SetItemText(niveauDepot, texte, dictColonnes["sansVentilation"])
                    impressionLigne.append(texte)
                else:
                    impressionLigne.append(u"")

            # Colonne Total
            texte = u"%.2f %s" % (totalLigne, SYMBOLE)
            self.SetItemText(niveauDepot, texte, dictColonnes["total"])
            impressionLigne.append(texte)
            
            self.dictImpression["contenu"].append(impressionLigne)
            
            # ----------------- Branches LABELS DE PRESTATIONS -------------
                
            listeLabelsPrestations = []
            for periode in listePeriodes :
                if dictVentilation.has_key(IDdepot) :
                    if dictVentilation[IDdepot].has_key(periode) :
                        for labelPrestation, montantVentilation in dictVentilation[IDdepot][periode].iteritems() : 
                            if labelPrestation not in listeLabelsPrestations :
                                listeLabelsPrestations.append(labelPrestation)
            listeLabelsPrestations.sort()

            for labelPrestation in listeLabelsPrestations :
                if self.affichage_details == True :
                    niveauPrestation = self.AppendItem(niveauDepot, labelPrestation)
                    self.SetItemFont(niveauPrestation, wx.Font(7, wx.SWISS, wx.NORMAL, wx.NORMAL))
                    self.SetItemTextColour(niveauPrestation, wx.Colour(160, 160, 160) )
                    impressionLigne = [labelPrestation,] 
                
                # Colonnes périodes
                totalLigne = 0.0
                for periode in listePeriodes :
                    texte = None
                    if dictVentilation.has_key(IDdepot) :
                        if dictVentilation[IDdepot].has_key(periode) :
                            if dictVentilation[IDdepot][periode].has_key(labelPrestation) :
                                valeur = dictVentilation[IDdepot][periode][labelPrestation]
                                totalLigne += valeur
                                if dictLigneTotal.has_key(labelPrestation) == False :
                                    dictLigneTotal[labelPrestation] = {}
                                if dictLigneTotal[labelPrestation].has_key(periode) == False :
                                    dictLigneTotal[labelPrestation][periode] = 0.0
                                dictLigneTotal[labelPrestation][periode] += valeur
                                if self.affichage_details == True :
                                    texte = u"%.2f %s" % (valeur, SYMBOLE)
                                    self.SetItemText(niveauPrestation, texte, dictColonnes[periode])
                                    impressionLigne.append(texte)
                    if texte == None and self.affichage_details == True : impressionLigne.append("")
                
                # Colonne Non ventilé
                if self.type == "depots" and self.affichage_details == True :
                    impressionLigne.append(u"")
                
                # Colonne Total
                if self.affichage_details == True :
                    texte = u"%.2f %s" % (totalLigne, SYMBOLE)
                    self.SetItemText(niveauPrestation, texte, dictColonnes["total"])
                    impressionLigne.append(texte)
                
                    self.dictImpression["contenu"].append(impressionLigne)
        
        # ------------ Ligne Total --------------
        niveauTotal = self.AppendItem(self.root, _(u"Total"))
        self.SetItemBackgroundColour(niveauTotal, wx.Colour(150, 150, 150) )
        self.SetItemTextColour(niveauTotal, wx.Colour(255, 255, 255) )
        
        impressionLigne = [_(u"Total"),]
        
        listeLabels = dictLigneTotal.keys()
        listeLabels.sort()
        
        # Ligne de TOTAL pour chaque PERIODE
        totalLigne = 0.0
        for periode in listePeriodes :
            totalColonne = 0.0
            for dateDepot, IDdepot, dictDepot in listeDepotsTemp :
                for label in listeLabels :
                    if dictVentilation.has_key(IDdepot) :
                        if dictVentilation[IDdepot].has_key(periode):
                            if dictVentilation[IDdepot][periode].has_key(label):
                                valeur = dictVentilation[IDdepot][periode][label]
                                totalColonne += valeur
            texte = u"%.2f %s" % (totalColonne, SYMBOLE)
            totalLigne += totalColonne
            self.SetItemText(niveauTotal, texte, dictColonnes[periode])
            impressionLigne.append(texte)
        
        # Total SANS VENTILATION
        if self.type == "depots" :
            texte = u"%.2f %s" % (totalSansVentilation, SYMBOLE)
            totalLigne += totalSansVentilation
            self.SetItemText(niveauTotal, texte, dictColonnes["sansVentilation"])
            impressionLigne.append(texte)
        
        # Total de la ligne de Total
        texte = u"%.2f %s" % (totalLigne, SYMBOLE)
        self.SetItemText(niveauTotal, texte, dictColonnes["total"])
        impressionLigne.append(texte)
        
        self.dictImpression["total"].append(impressionLigne)
        
        # Total des colonnes par label de prestation
        if self.affichage_details == True :
        
            for label in listeLabels :
                niveauPrestation = self.AppendItem(niveauTotal, label)
                self.SetItemFont(niveauPrestation, wx.Font(7, wx.SWISS, wx.NORMAL, wx.NORMAL))
                self.SetItemTextColour(niveauPrestation, wx.Colour(120, 120, 120) )
                self.SetItemBackgroundColour(niveauPrestation, wx.Colour(210, 210, 210) )
                
                impressionLigne = [label,]
                
                totalLigne = 0.0
                for periode in listePeriodes :
                    texte = None
                    if dictLigneTotal.has_key(label):
                        if dictLigneTotal[label].has_key(periode) :
                            valeur = dictLigneTotal[label][periode]
                            totalLigne += valeur
                            texte = u"%.2f %s" % (valeur, SYMBOLE)
                            self.SetItemText(niveauPrestation, texte, dictColonnes[periode])
                            impressionLigne.append(texte)
                    if texte == None : impressionLigne.append(u"")
                
                # Colonne None ventilé
                if self.type == "depots" :
                    impressionLigne.append(u"")
                
                # Colonne Total
                texte = u"%.2f %s" % (totalLigne, SYMBOLE)
                self.SetItemText(niveauPrestation, texte, dictColonnes["total"])
                impressionLigne.append(texte)
                
                self.dictImpression["total"].append(impressionLigne)
        
        self.ExpandAllChildren(self.root)   
        
    def RAZ(self):
        self.DeleteAllItems()
        for indexColonne in range(self.GetColumnCount()-1, -1, -1) :
            self.RemoveColumn(indexColonne)
        self.DeleteRoot() 
    
    def DevelopperTout(self):
        item = self.GetFirstChild(self.root)[0]
        for index in range(0, self.GetChildrenCount(self.root)-1) :
            self.Expand(item)
            item = self.GetNext(item)
        
    def ReduireTout(self):
        item = self.GetFirstChild(self.root)[0]
        for index in range(0, self.GetChildrenCount(self.root)-1) :
            self.Collapse(item)
            item = self.GetNext(item)
        
    def Imprimer(self):
        dlg = DLG_Options_impression_pdf.Dialog(self, categorie="synthese_ventilation", ctrl=CTRL_Parametres)
        if dlg.ShowModal() == wx.ID_OK:
            dictOptions = dlg.GetOptions()
            dlg.Destroy()
        else :
            dlg.Destroy()
            return

        # Création du PDF
        from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle
        from reportlab.lib.pagesizes import A4
        from reportlab.lib import colors
        from reportlab.lib.styles import ParagraphStyle
        
        hauteur_page = A4[0]
        largeur_page = A4[1]
            
        # Initialisation du PDF
        nomDoc = FonctionsPerso.GenerationNomDoc("STATS_VENTILATION", "pdf")
        if sys.platform.startswith("win") : nomDoc = nomDoc.replace("/", "\\")
        doc = SimpleDocTemplate(nomDoc, pagesize=(largeur_page, hauteur_page), topMargin=30, bottomMargin=30)
        story = []
        
        # Création du titre du document
        def Header():
            dataTableau = []
            largeursColonnes = ( (largeur_page-175, 100) )
            dateDuJour = UTILS_Dates.DateEngFr(str(datetime.date.today()))
            dataTableau.append( (_(u"Analyse croisée ventilation/dépôts"), _(u"%s\nEdité le %s") % (UTILS_Organisateur.GetNom(), dateDuJour)) )
            style = TableStyle([
                    ('BOX', (0,0), (-1,-1), 0.25, colors.black), 
                    ('VALIGN', (0,0), (-1,-1), 'TOP'), 
                    ('ALIGN', (0,0), (0,0), 'LEFT'), 
                    ('FONT',(0,0),(0,0), "Helvetica-Bold", 16), 
                    ('ALIGN', (1,0), (1,0), 'RIGHT'), 
                    ('FONT',(1,0),(1,0), "Helvetica", 6), 
                    ])
            tableau = Table(dataTableau, largeursColonnes)
            tableau.setStyle(style)
            story.append(tableau)
            story.append(Spacer(0,20))       
        
        # Insère un header
        Header() 
        
        # Tableau
        dataTableau = []
        largeursColonnes = [dictOptions["largeur_colonne_labels"],]
        for x in range(0, len(self.dictImpression["entete"])-1):
            largeursColonnes.append(dictOptions["largeur_colonne_valeurs"])
        
        # Entetes labels
        dataTableau.append(self.dictImpression["entete"])

        paraNormal = ParagraphStyle(name="normal", fontName="Helvetica", fontSize=dictOptions["taille_texte"], spaceAfter=0, leading=dictOptions["taille_texte"]+1, spaceBefore=0)
        paraTitre = ParagraphStyle(name="titre", fontName="Helvetica-Bold", fontSize=dictOptions["taille_texte"], spaceAfter=0, leading=dictOptions["taille_texte"]+1, spaceBefore=0)

        # Contenu du tableau
        listeRubriques = ("contenu", "total")
        for rubrique in listeRubriques :
            listeLignes = self.dictImpression[rubrique]

            indexLigne = 0
            for ligne in listeLignes :
                ligneTemp = []
                indexColonne = 0
                for texte in ligne :

                    # Aligne à droite les montants
                    if indexColonne > 0 :
                        texte = _(u"<para align='right'>%s</para>") % texte

                    case = Paragraph(texte, paraNormal)

                    # Ligne de titre
                    if rubrique == "contenu" and indexLigne in self.dictImpression["coloration"] :
                        case = Paragraph(texte, paraTitre)

                    ligneTemp.append(case)
                    indexColonne += 1

                dataTableau.append(ligneTemp)
                indexLigne += 1
        
        positionLigneTotal = len(self.dictImpression["contenu"]) + 1
        listeStyles = [
            ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), # Centre verticalement toutes les cases
            ('FONT',(0,0),(-1,-1), "Helvetica", dictOptions["taille_texte"]), # Donne la police de caract. + taille de police
            ('GRID', (0,0), (-1,-1), 0.25, colors.black), # Crée la bordure noire pour tout le tableau
            ('ALIGN', (0,0), (-1,-1), 'CENTRE'), # Centre les cases
            ('BACKGROUND', (0,0), (-1,0), UTILS_Divers.ConvertCouleurWXpourPDF(dictOptions["couleur_fond_entetes"]) ), # Donne la couleur de fond du label
            ('BACKGROUND', (0, positionLigneTotal), (-1, positionLigneTotal), UTILS_Divers.ConvertCouleurWXpourPDF(dictOptions["couleur_fond_total"]) ), # Donne la couleur de fond du label
            ]

        # Formatage des lignes "Activités"
        for indexColoration in self.dictImpression["coloration"] :
            listeStyles.append( ('BACKGROUND', (0, indexColoration+1), (-1, indexColoration+1), UTILS_Divers.ConvertCouleurWXpourPDF(dictOptions["couleur_fond_depot"])))
                
        # Création du tableau
        tableau = Table(dataTableau, largeursColonnes)
        tableau.setStyle(TableStyle(listeStyles))
        story.append(tableau)
        story.append(Spacer(0,20))
            
        # Enregistrement du PDF
        doc.build(story)
        
        # Affichage du PDF
        FonctionsPerso.LanceFichierExterne(nomDoc)
Esempio n. 17
0
    def Impression(self, listeActivites, listePeriodes):
        # Création du PDF
        self.taille_page = A4
        self.orientation = "PORTRAIT"
        if self.orientation == "PORTRAIT" :
            self.hauteur_page = self.taille_page[1]
            self.largeur_page = self.taille_page[0]
        else:
            self.hauteur_page = self.taille_page[0]
            self.largeur_page = self.taille_page[1]
        
        # Création des conditions pour les requêtes SQL
        conditionsPeriodes = GetSQLdates(listePeriodes)
        
        if len(listeActivites) == 0 : conditionActivites = "()"
        elif len(listeActivites) == 1 : conditionActivites = "(%d)" % listeActivites[0]
        else : conditionActivites = str(tuple(listeActivites))
                                    
        # Récupération des individus grâce à leurs consommations
        self.EcritStatusBar(_(u"Recherche des individus..."))
        DB = GestionDB.DB() 
        req = """SELECT individus.IDindividu, IDcivilite, nom, prenom, date_naiss
        FROM consommations 
        LEFT JOIN individus ON individus.IDindividu = consommations.IDindividu
        WHERE etat IN ("reservation", "present")
        AND IDactivite IN %s AND %s
        GROUP BY individus.IDindividu
        ORDER BY nom, prenom
        ;""" % (conditionActivites, conditionsPeriodes)
        DB.ExecuterReq(req)
        listeIndividus = DB.ResultatReq()
        DB.Close() 
        if len(listeIndividus) == 0 :
            dlg = wx.MessageDialog(self, _(u"Aucun individu n'a été trouvé avec les paramètres spécifiés !"), _(u"Erreur"), wx.OK | wx.ICON_EXCLAMATION)
            dlg.ShowModal()
            dlg.Destroy()
            self.EcritStatusBar(u"")
            return

        dictIndividus = {}
        listeIDindividus = []
        
        dictAnniversaires = {} 
        
        self.EcritStatusBar(_(u"Recherche des dates de naissance..."))
        for IDindividu, IDcivilite, nom, prenom, date_naiss in listeIndividus :
            if date_naiss != None : 
                date_naiss = DateEngEnDateDD(date_naiss)
                age = GetAge(date_naiss)
                jour = date_naiss.day
                mois = date_naiss.month
                
                # Mémorisation de l'individu
                dictIndividus[IDindividu] = { 
                    "IDcivilite" : IDcivilite, "nom" : nom, "prenom" : prenom, 
                    "age" : age, "date_naiss" : date_naiss,
                    }
                
                # Mémorisation du IDindividu
                if dictAnniversaires.has_key(mois) == False : 
                    dictAnniversaires[mois] = {} 
                if dictAnniversaires[mois].has_key(jour) == False : 
                    dictAnniversaires[mois][jour] = []
                dictAnniversaires[mois][jour].append(IDindividu)
                
                if IDindividu not in listeIDindividus :
                    listeIDindividus.append(IDindividu) 
                
        # Récupération des photos individuelles
        dictPhotos = {}
        taillePhoto = 128
        if self.ctrl_photos.GetSelection() == 0 : tailleImageFinal = 16
        if self.ctrl_photos.GetSelection() == 1 : tailleImageFinal = 32
        if self.ctrl_photos.GetSelection() == 2 : tailleImageFinal = 64
        if self.check_photos.GetValue() == True :
            index = 0
            for IDindividu in listeIDindividus :
                self.EcritStatusBar(_(u"Recherche des photos... %d/%d") % (index, len(listeIDindividus)))
                IDcivilite = dictIndividus[IDindividu]["IDcivilite"]
                nomFichier = Chemins.GetStaticPath("Images/128x128/%s" % DICT_CIVILITES[IDcivilite]["nomImage"])
                IDphoto, bmp = CTRL_Photo.GetPhoto(IDindividu=IDindividu, nomFichier=nomFichier, taillePhoto=(taillePhoto, taillePhoto), qualite=100)
                
                # Création de la photo dans le répertoire Temp
                nomFichier = UTILS_Fichiers.GetRepTemp(fichier="photoTmp%d.jpg" % IDindividu)
                bmp.SaveFile(nomFichier, type=wx.BITMAP_TYPE_JPEG)
                img = Image(nomFichier, width=tailleImageFinal, height=tailleImageFinal)
                dictPhotos[IDindividu] = img
                
                index += 1
            
        # ---------------- Création du PDF -------------------
        self.EcritStatusBar(_(u"Création du PDF...")) 
        
        # Initialisation du PDF
        nomDoc = FonctionsPerso.GenerationNomDoc("ANNIVERSAIRES", "pdf")
        if sys.platform.startswith("win") : nomDoc = nomDoc.replace("/", "\\")
        doc = BaseDocTemplate(nomDoc, pagesize=(self.largeur_page, self.hauteur_page), topMargin=30, bottomMargin=30, showBoundary=False)
        doc.addPageTemplates(MyPageTemplate(pageSize=(self.largeur_page, self.hauteur_page)))
        story = []
                        
        # Mois
        listeMois = dictAnniversaires.keys()
        listeMois.sort() 
        for numMois in listeMois :
            
            # Mémorise le numéro de mois pour le titre de la page
            nomMois = LISTE_NOMS_MOIS[numMois-1]
            story.append(DocAssign("numMois", numMois))

            # Jours
            dictJours = dictAnniversaires[numMois]
            listeJours = dictJours.keys() 
            listeJours.sort() 
            for numJour in listeJours :                                
                # Initialisation du tableau
                dataTableau = []
                largeursColonnes = []
                                    
                # Recherche des entêtes de colonnes :
                if self.check_photos.GetValue() == True :
                    largeursColonnes.append(tailleImageFinal+6)
                
                # Colonne nom de l'individu
                largeursColonnes.append(LARGEUR_COLONNE-sum(largeursColonnes))
                
                # Label numéro de jour
                ligne = []
                ligne.append(str(numJour))
                if self.check_photos.GetValue() == True :
                    ligne.append(u"")
                dataTableau.append(ligne)
                
                # Individus
                listeIndividus = dictAnniversaires[numMois][numJour]
                
                for IDindividu in listeIndividus :
                    ligne = []
                    
                    # Photo
                    if self.check_photos.GetValue() == True and IDindividu in dictPhotos :
                        img = dictPhotos[IDindividu]
                        ligne.append(img)
                    
                    # Nom
                    nom = dictIndividus[IDindividu]["nom"]
                    prenom = dictIndividus[IDindividu]["prenom"]
                    ligne.append(u"%s %s" % (nom, prenom))
                    
                    # Ajout de la ligne individuelle dans le tableau
                    dataTableau.append(ligne)
             
                couleurFondJour = (0.8, 0.8, 1) # Vert -> (0.5, 1, 0.2)
                couleurFondTableau = (1, 1, 1)
                
                style = TableStyle([
                        ('VALIGN', (0,0), (-1,-1), 'MIDDLE'), # Centre verticalement toutes les cases
                        ('BACKGROUND', (0,0), (-1,-1), couleurFondTableau), # Donne la couleur de fond du titre de groupe
                        
                        ('FONT',(0,0),(-1,-1), "Helvetica", 7), # Donne la police de caract. + taille de police 
                        ('GRID', (0,0), (-1,-1), 0.25, colors.black), # Crée la bordure noire pour tout le tableau
                        ('ALIGN', (0,1), (-1,-1), 'CENTRE'), # Centre les cases
                        
                        ('SPAN',(0,0),(-1,0)), # Fusionne les lignes du haut pour faire le titre du groupe
                        ('FONT',(0,0),(0,0), "Helvetica-Bold", 10), # Donne la police de caract. + taille de police du titre de groupe
                        ('BACKGROUND', (0,0), (-1,0), couleurFondJour), # Donne la couleur de fond du titre de groupe
                        
                        ])
                    
                # Création du tableau
                tableau = Table(dataTableau, largeursColonnes)
                tableau.setStyle(style)
                story.append(tableau)
                story.append(Spacer(0, 10))
                    
            # Saut de page après un mois
            story.append(PageBreak())
            
        # Enregistrement du PDF
        doc.build(story)
        
        # Affichage du PDF
        FonctionsPerso.LanceFichierExterne(nomDoc)
        
        self.EcritStatusBar(u"") 
Esempio n. 18
0
    def ImpressionListe(self):
        """ Imprime la liste des comptes sélectionnés """
        # Récupère les noms des colonnes
        listeColonnes = []
        for numColonne in range(0, self.GetColumnCount()):
            labelColonne = self.GetColumnText(numColonne)
            largeurColonne = self.GetColumnWidth(numColonne)
            listeColonnes.append((labelColonne, largeurColonne / 1.3))
        # Récupère les lignes du tableau
        listeLignes = []
        item = self.root
        for index in range(0, self.GetChildrenCount(self.root)):
            ligne = []
            item = self.GetNext(item)
            if self.GetPyData(item)["type"] == "compte" and self.IsItemChecked(
                    item):
                for numColonne in range(0, self.GetColumnCount()):
                    texte = item.GetText(numColonne)
                    ligne.append(texte)
                listeLignes.append(ligne)

        # Création du PDF
        from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, PageBreak
        from reportlab.platypus.flowables import ParagraphAndImage, Image
        from reportlab.rl_config import defaultPageSize
        from reportlab.lib.units import inch, cm
        from reportlab.lib.utils import ImageReader
        from reportlab.lib import colors
        from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
        self.hauteur_page = defaultPageSize[1]
        self.largeur_page = defaultPageSize[0]

        # Initialisation du PDF
        PAGE_HEIGHT = defaultPageSize[1]
        PAGE_WIDTH = defaultPageSize[0]
        nomDoc = FonctionsPerso.GenerationNomDoc("LISTE_ATTESTATIONS", "pdf")
        if sys.platform.startswith("win"): nomDoc = nomDoc.replace("/", "\\")
        doc = SimpleDocTemplate(nomDoc, topMargin=30, bottomMargin=30)
        story = []

        largeurContenu = 520

        # Création du titre du document
        def Header():
            dataTableau = []
            largeursColonnes = ((420, 100))
            dateDuJour = DateEngFr(str(datetime.date.today()))
            dataTableau.append(
                (_(u"Liste des attestations"), _(u"%s\nEdité le %s") %
                 (UTILS_Organisateur.GetNom(), dateDuJour)))
            style = TableStyle([
                ('BOX', (0, 0), (-1, -1), 0.25, colors.black),
                ('VALIGN', (0, 0), (-1, -1), 'TOP'),
                ('ALIGN', (0, 0), (0, 0), 'LEFT'),
                ('FONT', (0, 0), (0, 0), "Helvetica-Bold", 16),
                ('ALIGN', (1, 0), (1, 0), 'RIGHT'),
                ('FONT', (1, 0), (1, 0), "Helvetica", 6),
            ])
            tableau = Table(dataTableau, largeursColonnes)
            tableau.setStyle(style)
            story.append(tableau)
            story.append(Spacer(0, 20))

        # Insère un header
        Header()

        # Noms de colonnes
        dataTableau = []
        largeursColonnes = []

        ligne = []
        for labelColonne, largeurColonne in listeColonnes:
            ligne.append(labelColonne)
            largeursColonnes.append(largeurColonne)
        dataTableau.append(ligne)

        # Création des lignes
        for ligne in listeLignes:
            dataTableau.append(ligne)

        couleurFond = (0.9, 0.9, 0.9)
        listeStyles = [
            ('VALIGN', (0, 0), (-1, -1),
             'MIDDLE'),  # Centre verticalement toutes les cases
            ('FONT', (0, 0), (-1, -1), "Helvetica",
             7),  # Donne la police de caract. + taille de police 
            ('GRID', (0, 0), (-1, -1), 0.25,
             colors.black),  # Crée la bordure noire pour tout le tableau
            ('ALIGN', (0, 0), (-1, -1), 'CENTRE'),  # Centre les cases
            ('BACKGROUND', (0, 0), (-1, 0),
             couleurFond),  # Donne la couleur de fond du titre de groupe
        ]

        # Création du tableau
        tableau = Table(dataTableau, largeursColonnes)
        tableau.setStyle(TableStyle(listeStyles))
        story.append(tableau)

        # Enregistrement du PDF
        doc.build(story)

        # Affichage du PDF
        FonctionsPerso.LanceFichierExterne(nomDoc)
    def Imprimer(self):
        # Création du PDF
        from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, PageBreak
        from reportlab.platypus.flowables import ParagraphAndImage, Image
        from reportlab.rl_config import defaultPageSize
        from reportlab.lib.pagesizes import A4
        from reportlab.lib.units import inch, cm
        from reportlab.lib.utils import ImageReader
        from reportlab.lib import colors
        from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle

        hauteur_page = A4[0]
        largeur_page = A4[1]

        # Initialisation du PDF
        nomDoc = FonctionsPerso.GenerationNomDoc("synthese_modes_reglements",
                                                 "pdf")
        if sys.platform.startswith("win"): nomDoc = nomDoc.replace("/", "\\")
        doc = SimpleDocTemplate(nomDoc,
                                pagesize=(largeur_page, hauteur_page),
                                topMargin=30,
                                bottomMargin=30,
                                leftMargin=40,
                                rightMargin=40)
        story = []

        # Création du titre du document
        dataTableau = []
        largeursColonnes = ((largeur_page - 175, 100))
        dateDuJour = DateEngFr(str(datetime.date.today()))
        dataTableau.append(
            (_(u"Synthèse des modes de règlements"), _(u"%s\nEdité le %s") %
             (UTILS_Organisateur.GetNom(), dateDuJour)))
        style = TableStyle([
            ('BOX', (0, 0), (-1, -1), 0.25, colors.black),
            ('VALIGN', (0, 0), (-1, -1), 'TOP'),
            ('ALIGN', (0, 0), (0, 0), 'LEFT'),
            ('FONT', (0, 0), (0, 0), "Helvetica-Bold", 16),
            ('ALIGN', (1, 0), (1, 0), 'RIGHT'),
            ('FONT', (1, 0), (1, 0), "Helvetica", 6),
        ])
        tableau = Table(dataTableau, largeursColonnes)
        tableau.setStyle(style)
        story.append(tableau)
        story.append(Spacer(0, 10))

        # Intro
        styleA = ParagraphStyle(name="A",
                                fontName="Helvetica",
                                fontSize=6,
                                spaceAfter=20)
        story.append(Paragraph(self.labelParametres, styleA))

        # Tableau
        dataTableau = []
        largeursColonnes = [
            160,
        ]
        for x in range(0, len(self.dictImpression["entete"]) - 1):
            largeursColonnes.append(45)

        # Entetes labels
        dataTableau.append(self.dictImpression["entete"])

        # Contenu du tableau
        listeRubriques = ("contenu", "total")
        for rubrique in listeRubriques:
            listeLignes = self.dictImpression[rubrique]

            for ligne in listeLignes:
                dataTableau.append(ligne)

        positionLigneTotal = len(self.dictImpression["contenu"]) + 1
        listeStyles = [
            ('VALIGN', (0, 0), (-1, -1),
             'MIDDLE'),  # Centre verticalement toutes les cases
            ('FONT', (0, 0), (-1, -1), "Helvetica",
             7),  # Donne la police de caract. + taille de police 
            ('GRID', (0, 0), (-1, -1), 0.25,
             colors.black),  # Crée la bordure noire pour tout le tableau
            ('ALIGN', (0, 0), (-1, -1), 'CENTRE'),  # Centre les cases
            ('BACKGROUND', (0, 0), (-1, 0),
             (0.6, 0.6, 0.6)),  # Donne la couleur de fond du label
            ('BACKGROUND', (0, positionLigneTotal), (-1, positionLigneTotal),
             (0.6, 0.6, 0.6)),  # Donne la couleur de fond du label
        ]

        # Formatage des lignes "Activités"
        for indexColoration in self.dictImpression["coloration"]:
            listeStyles.append(
                ('FONT', (0, indexColoration + 1), (-1, indexColoration + 1),
                 "Helvetica-Bold", 7))
            listeStyles.append(('BACKGROUND', (0, indexColoration + 1),
                                (-1, indexColoration + 1), (0.8, 0.8, 0.8)))

        # Création du tableau
        tableau = Table(dataTableau, largeursColonnes)
        tableau.setStyle(TableStyle(listeStyles))
        story.append(tableau)
        story.append(Spacer(0, 20))

        # Enregistrement du PDF
        doc.build(story)

        # Affichage du PDF
        FonctionsPerso.LanceFichierExterne(nomDoc)
Esempio n. 20
0
 def OnLinkClicked(self, link):
     FonctionsPerso.LanceFichierExterne(_(u"http://www.noethys.com"))
Esempio n. 21
0
def ExportTexte(listview=None, grid=None, titre=u"", listeColonnes=None, listeValeurs=None, autoriseSelections=True):
    """ Export de la liste au format texte """
    if (listview != None and len(listview.donnees) == 0) or (grid != None and (grid.GetNumberRows() == 0 or grid.GetNumberCols() == 0)):
        dlg = wx.MessageDialog(None, _(u"Il n'y a aucune donnée dans la liste !"), "Erreur", wx.OK | wx.ICON_ERROR)
        dlg.ShowModal()
        dlg.Destroy()
        return

    # Récupération des valeurs
    if listview != None and listeColonnes == None and listeValeurs == None :
        listeColonnes, listeValeurs = GetValeursListview(listview, format="texte")
        
    if grid != None and listeColonnes == None and listeValeurs == None :
        autoriseSelections = False
        listeColonnes, listeValeurs = GetValeursGrid(grid)

    # Selection des lignes
    if autoriseSelections == True :
        dlg = DLG_Selection_liste.Dialog(None, listeColonnes, listeValeurs, type="exportTexte")
        if dlg.ShowModal() == wx.ID_OK:
            listeSelections = dlg.GetSelections()
            dlg.Destroy()
        else:
            dlg.Destroy()
            return False
    
    # Demande à l'utilisateur le nom de fichier et le répertoire de destination
    nomFichier = "ExportTexte_%s.txt" % datetime.datetime.now().strftime("%Y%m%d%H%M%S")
    wildcard = "Fichier texte (*.txt)|*.txt|" \
                    "All files (*.*)|*.*"
    sp = wx.StandardPaths.Get()
    cheminDefaut = sp.GetDocumentsDir()
    dlg = wx.FileDialog(
        None, message = _(u"Veuillez sélectionner le répertoire de destination et le nom du fichier"), defaultDir=cheminDefaut, 
        defaultFile = nomFichier, 
        wildcard = wildcard, 
        style = wx.SAVE
        )
    dlg.SetFilterIndex(0)
    if dlg.ShowModal() == wx.ID_OK:
        cheminFichier = dlg.GetPath()
        dlg.Destroy()
    else:
        dlg.Destroy()
        return
    
    # Le fichier de destination existe déjà :
    if os.path.isfile(cheminFichier) == True :
        dlg = wx.MessageDialog(None, _(u"Un fichier portant ce nom existe déjà. \n\nVoulez-vous le remplacer ?"), "Attention !", wx.YES_NO | wx.NO_DEFAULT | wx.ICON_EXCLAMATION)
        if dlg.ShowModal() == wx.ID_NO :
            dlg.Destroy()
            return False
        else:
            dlg.Destroy()

    # Création du fichier texte
    texte = ""
    separateur = ";"
    for labelCol, alignement, largeur, code in listeColonnes :
        try :
            if "CheckState" in unicode(code) :
                code = "Coche"
        except :
            pass
        texte += labelCol + separateur
    texte = texte[:-1] + "\n"

    for valeurs in listeValeurs :
        if autoriseSelections == False or valeurs[0] == "" or int(valeurs[0]) in listeSelections :
            for valeur in valeurs :
                if valeur == None :
                    valeur = u""
                texte += u"%s%s" % (valeur, separateur)
            texte = texte[:-1] + "\n"
    
    # Elimination du dernier saut à la ligne
    texte = texte[:-1]

    # Création du fichier texte
    f = open(cheminFichier, "w")
    f.write(texte.encode("utf8"))
    f.close()
    
    # Confirmation de création du fichier et demande d'ouverture directe dans Excel
    txtMessage = _(u"Le fichier Texte a été créé avec succès. Souhaitez-vous l'ouvrir dès maintenant ?")
    dlgConfirm = wx.MessageDialog(None, txtMessage, _(u"Confirmation"), wx.YES_NO|wx.NO_DEFAULT|wx.ICON_QUESTION)
    reponse = dlgConfirm.ShowModal()
    dlgConfirm.Destroy()
    if reponse == wx.ID_NO:
        return
    else:
        FonctionsPerso.LanceFichierExterne(cheminFichier)
 def ExportTexte(self, event=None):
     """ Export de la liste au format texte """
     # Vérifie qu"il y a des adresses mails saisies
     if len(self.donnees) == 0:
         dlg = wx.MessageDialog(self,
                                _(u"La liste des destinataires est vide !"),
                                "Erreur", wx.OK | wx.ICON_EXCLAMATION)
         dlg.ShowModal()
         dlg.Destroy()
         return
     # Demande à l'utilisateur le nom de fichier et le répertoire de destination
     nomFichier = "ExportTexte.txt"
     wildcard = "Fichier texte (*.txt)|*.txt|" \
                     "All files (*.*)|*.*"
     sp = wx.StandardPaths.Get()
     cheminDefaut = sp.GetDocumentsDir()
     dlg = wx.FileDialog(
         None,
         message=
         _(u"Veuillez sélectionner le répertoire de destination et le nom du fichier"
           ),
         defaultDir=cheminDefaut,
         defaultFile=nomFichier,
         wildcard=wildcard,
         style=wx.SAVE)
     dlg.SetFilterIndex(0)
     if dlg.ShowModal() == wx.ID_OK:
         cheminFichier = dlg.GetPath()
         dlg.Destroy()
     else:
         dlg.Destroy()
         return
     # Le fichier de destination existe déjà :
     if os.path.isfile(cheminFichier) == True:
         dlg = wx.MessageDialog(
             None,
             _(u"Un fichier portant ce nom existe déjà. \n\nVoulez-vous le remplacer ?"
               ), "Attention !",
             wx.YES_NO | wx.NO_DEFAULT | wx.ICON_EXCLAMATION)
         if dlg.ShowModal() == wx.ID_NO:
             return False
             dlg.Destroy()
         else:
             dlg.Destroy()
     # Création du fichier texte
     texte = ""
     separateur = ";"
     for track in self.donnees:
         texte += track.adresse + separateur
     texte = texte[:-1]
     # Création du fichier texte
     f = open(cheminFichier, "w")
     f.write(texte.encode("iso-8859-15"))
     f.close()
     # Confirmation de création du fichier et demande d'ouverture directe dans Excel
     txtMessage = _(
         u"Le fichier Texte a été créé avec succès. Souhaitez-vous l'ouvrir dès maintenant ?"
     )
     dlgConfirm = wx.MessageDialog(
         None, txtMessage, _(u"Confirmation"),
         wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION)
     reponse = dlgConfirm.ShowModal()
     dlgConfirm.Destroy()
     if reponse == wx.ID_NO:
         return
     else:
         FonctionsPerso.LanceFichierExterne(cheminFichier)
Esempio n. 23
0
 def OnLinkClicked(self, link):
     FonctionsPerso.LanceFichierExterne(link.GetHref())
 def ExportExcel(self, event=None):
     """ Export Excel """
     titre = _(u"Destinataires")
     # Vérifie qu"il y a des adresses mails saisies
     if len(self.donnees) == 0:
         dlg = wx.MessageDialog(self,
                                _(u"La liste des destinataires est vide !"),
                                "Erreur", wx.OK | wx.ICON_EXCLAMATION)
         dlg.ShowModal()
         dlg.Destroy()
         return
     # Demande à l'utilisateur le nom de fichier et le répertoire de destination
     nomFichier = "ExportExcel_%s.xls" % datetime.datetime.now().strftime(
         "%Y%m%d%H%M%S")
     wildcard = "Fichier Excel (*.xls)|*.xls|" \
                     "All files (*.*)|*.*"
     sp = wx.StandardPaths.Get()
     cheminDefaut = sp.GetDocumentsDir()
     dlg = wx.FileDialog(
         None,
         message=
         _(u"Veuillez sélectionner le répertoire de destination et le nom du fichier"
           ),
         defaultDir=cheminDefaut,
         defaultFile=nomFichier,
         wildcard=wildcard,
         style=wx.SAVE)
     dlg.SetFilterIndex(0)
     if dlg.ShowModal() == wx.ID_OK:
         cheminFichier = dlg.GetPath()
         dlg.Destroy()
     else:
         dlg.Destroy()
         return
     # Le fichier de destination existe déjà :
     if os.path.isfile(cheminFichier) == True:
         dlg = wx.MessageDialog(
             None,
             _(u"Un fichier portant ce nom existe déjà. \n\nVoulez-vous le remplacer ?"
               ), "Attention !",
             wx.YES_NO | wx.NO_DEFAULT | wx.ICON_EXCLAMATION)
         if dlg.ShowModal() == wx.ID_NO:
             return False
             dlg.Destroy()
         else:
             dlg.Destroy()
     # Export
     import pyExcelerator
     # Création d'un classeur
     wb = pyExcelerator.Workbook()
     # Création d'une feuille
     ws1 = wb.add_sheet(titre)
     # Remplissage de la feuille
     x = 0
     for track in self.donnees:
         ws1.write(x, 0, track.adresse)
         x += 1
     # Finalisation du fichier xls
     wb.save(cheminFichier)
     # Confirmation de création du fichier et demande d'ouverture directe dans Excel
     txtMessage = _(
         u"Le fichier Excel a été créé avec succès. Souhaitez-vous l'ouvrir dès maintenant ?"
     )
     dlgConfirm = wx.MessageDialog(
         None, txtMessage, _(u"Confirmation"),
         wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION)
     reponse = dlgConfirm.ShowModal()
     dlgConfirm.Destroy()
     if reponse == wx.ID_NO:
         return
     else:
         FonctionsPerso.LanceFichierExterne(cheminFichier)
    def __init__(self,
                 dictValeurs={},
                 dictOptions={},
                 IDmodele=None,
                 ouverture=True,
                 nomFichier=None):
        """ Impression """
        global DICT_VALEURS, DICT_OPTIONS
        DICT_VALEURS = dictValeurs
        DICT_OPTIONS = dictOptions

        # Initialisation du document
        if nomFichier == None:
            nomDoc = FonctionsPerso.GenerationNomDoc("INSCRIPTIONS", "pdf")
        else:
            nomDoc = nomFichier
        doc = BaseDocTemplate(nomDoc, pagesize=TAILLE_PAGE, showBoundary=False)

        # Mémorise le ID du modèle
        modeleDoc = DLG_Noedoc.ModeleDoc(IDmodele=IDmodele)
        doc.modeleDoc = modeleDoc

        # Importe le template de la première page
        doc.addPageTemplates(MyPageTemplate(pageSize=TAILLE_PAGE, doc=doc))

        story = []
        styleSheet = getSampleStyleSheet()
        h3 = styleSheet['Heading3']
        styleTexte = styleSheet['BodyText']
        styleTexte.fontName = "Helvetica"
        styleTexte.fontSize = 9
        styleTexte.borderPadding = 9
        styleTexte.leading = 12

        # ----------- Insertion du contenu des frames --------------
        listeLabels = []
        for IDinscription, dictValeur in dictValeurs.items():
            listeLabels.append((dictValeur["{FAMILLE_NOM}"], IDinscription))
        listeLabels.sort()

        for labelDoc, IDinscription in listeLabels:
            dictValeur = dictValeurs[IDinscription]
            if dictValeur["select"] == True:
                story.append(DocAssign("IDinscription", IDinscription))
                nomSansCivilite = dictValeur["{FAMILLE_NOM}"]
                story.append(Bookmark(nomSansCivilite, str(IDinscription)))

                # ----------- Insertion du cadre principal --------------
                cadre_principal = doc.modeleDoc.FindObjet("cadre_principal")
                if cadre_principal != None:

                    if "intro" in DICT_OPTIONS and DICT_OPTIONS[
                            "intro"] != None or "tableau" in DICT_OPTIONS and DICT_VALEURS[
                                "tableau"] == True:
                        # ------------------- TITRE -----------------
                        dataTableau = []
                        largeursColonnes = [
                            TAILLE_CADRE_CONTENU[2],
                        ]
                        dataTableau.append(
                            (_(u"Confirmation d'inscription"), ))
                        dataTableau.append((u"", ))
                        style = TableStyle([
                            ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
                            ('FONT', (0, 0), (0, 0), "Helvetica-Bold", 19),
                            ('FONT', (0, 1), (0, 1), "Helvetica", 8),
                            ('LINEBELOW', (0, 0), (0, 0), 0.25, colors.black),
                            ('ALIGN', (0, 0), (-1, -1), 'LEFT'),
                        ])
                        tableau = Table(dataTableau, largeursColonnes)
                        tableau.setStyle(style)
                        story.append(tableau)
                        story.append(Spacer(0, 10))

                        # TEXTE D'INTRODUCTION
                        paraStyleIntro = ParagraphStyle(
                            name="intro",
                            fontName="Helvetica",
                            fontSize=11,
                            leading=14,
                            spaceBefore=0,
                            spaceafter=0,
                            leftIndent=0,
                            rightIndent=0,
                            alignment=0,
                        )

                    if "intro" in DICT_OPTIONS and DICT_OPTIONS[
                            "intro"] != None:
                        texteIntro = DICT_VALEURS["intro"]
                        story.append(
                            Paragraph(u"<i>%s</i>" % texteIntro,
                                      paraStyleIntro))
                        story.append(Spacer(0, 20))

                    if "tableau" in DICT_OPTIONS and DICT_OPTIONS[
                            "tableau"] == True:
                        # ------------------- TABLEAU CONTENU -----------------
                        dataTableau = []
                        largeursColonnes = [80, 280]
                        paraStyle = ParagraphStyle(
                            name="detail",
                            fontName="Helvetica-Bold",
                            fontSize=9,
                        )
                        dataTableau.append(
                            (_(u"Nom"),
                             Paragraph(DICT_VALEURS["{INDIVIDU_NOM}"],
                                       paraStyle)))
                        dataTableau.append(
                            (_(u"Prénom"),
                             Paragraph(DICT_VALEURS["{INDIVIDU_PRENOM}"],
                                       paraStyle)))
                        dataTableau.append(
                            (_(u"Activité"),
                             Paragraph(DICT_VALEURS["{ACTIVITE_NOM_LONG}"],
                                       paraStyle)))
                        dataTableau.append(
                            (_(u"Groupe"),
                             Paragraph(DICT_VALEURS["{GROUPE_NOM_LONG}"],
                                       paraStyle)))
                        dataTableau.append(
                            (_(u"Catégorie"),
                             Paragraph(DICT_VALEURS["{NOM_CATEGORIE_TARIF}"],
                                       paraStyle)))

                        style = TableStyle([
                            ('VALIGN', (0, 0), (-1, -1), 'MIDDLE'),
                            ('FONT', (0, 0), (0, -1), "Helvetica", 9),
                            ('GRID', (0, 0), (-1, -1), 0.25, colors.black),
                            ('ALIGN', (0, 0), (0, -1), 'RIGHT'),
                        ])
                        tableau = Table(dataTableau, largeursColonnes)
                        tableau.setStyle(style)
                        story.append(tableau)

                # Saut de page
                story.append(PageBreak())

        # Finalisation du PDF
        doc.build(story)

        # Ouverture du PDF
        if ouverture == True:
            FonctionsPerso.LanceFichierExterne(nomDoc)
    def Imprimer(self, event=None):
        # Création du PDF
        from reportlab.platypus import SimpleDocTemplate, Spacer, Table, TableStyle
        from reportlab.rl_config import defaultPageSize
        from reportlab.lib import colors
        self.hauteur_page = defaultPageSize[1]
        self.largeur_page = defaultPageSize[0]

        # Initialisation du PDF
        nomDoc = FonctionsPerso.GenerationNomDoc("LISTE_ATTENTE", "pdf")
        if sys.platform.startswith("win"): nomDoc = nomDoc.replace("/", "\\")
        doc = SimpleDocTemplate(nomDoc, topMargin=30, bottomMargin=30)
        story = []

        largeurContenu = 520

        # Création du titre du document
        def Header():
            dataTableau = []
            largeursColonnes = ((420, 100))
            dateDuJour = UTILS_Dates.DateEngFr(str(datetime.date.today()))
            if self.mode == "attente":
                titre = _(u"Inscriptions en attente")
            else:
                titre = _(u"Inscriptions refusées")
            dataTableau.append((titre, _(u"%s\nEdité le %s") %
                                (UTILS_Organisateur.GetNom(), dateDuJour)))
            style = TableStyle([
                ('BOX', (0, 0), (-1, -1), 0.25, colors.black),
                ('VALIGN', (0, 0), (-1, -1), 'TOP'),
                ('ALIGN', (0, 0), (0, 0), 'LEFT'),
                ('FONT', (0, 0), (0, 0), "Helvetica-Bold", 16),
                ('ALIGN', (1, 0), (1, 0), 'RIGHT'),
                ('FONT', (1, 0), (1, 0), "Helvetica", 6),
            ])
            tableau = Table(dataTableau, largeursColonnes)
            tableau.setStyle(style)
            story.append(tableau)
            story.append(Spacer(0, 20))

        # Insère un header
        Header()

        # Un tableau par date
        for nom_activite, listeGroupes in self.listeImpression:

            dataTableau = []
            largeursColonnes = [180, 180, 160]

            dataTableau.append((nom_activite, "", ""))

            # Groupes
            listeIndexGroupes = []
            indexLigne = 0
            for nomGroupe, listeIndividus in listeGroupes:
                indexLigne += 1
                listeIndexGroupes.append(indexLigne)

                dataTableau.append((nomGroupe, "", ""))

                # Individus
                for dictIndividu in listeIndividus:
                    placeDispo = dictIndividu["placeDispo"]
                    texteIndividu = dictIndividu["texteIndividu"]
                    texteDateSaisie = _(
                        u"Saisie le %s") % dictIndividu["texteDateSaisie"]
                    nomCategorie = dictIndividu["nomCategorie"]
                    dataTableau.append(
                        (texteIndividu, texteDateSaisie, nomCategorie))
                    indexLigne += 1

            couleurFond = (0.8, 0.8, 1)  # Vert -> (0.5, 1, 0.2)

            listeStyles = [
                ('VALIGN', (0, 0), (-1, -1),
                 'MIDDLE'),  # Centre verticalement toutes les cases
                ('FONT', (0, 0), (-1, -1), "Helvetica",
                 7),  # Donne la police de caract. + taille de police 
                ('GRID', (0, 0), (-1, -1), 0.25,
                 colors.black),  # Crée la bordure noire pour tout le tableau
                ('ALIGN', (0, 1), (-1, -1), 'CENTRE'),  # Centre les cases
                ('ALIGN', (0, 1), (-1, 1),
                 'CENTRE'),  # Ligne de labels colonne alignée au centre
                ('FONT', (0, 1), (-1, 1), "Helvetica", 6
                 ),  # Donne la police de caract. + taille de police des labels
                (
                    'SPAN', (0, 0), (-1, 0)
                ),  # Fusionne les lignes du haut pour faire le titre du groupe
                (
                    'FONT', (0, 0), (0, 0), "Helvetica-Bold", 10
                ),  # Donne la police de caract. + taille de police du titre de groupe
                ('BACKGROUND', (0, 0), (-1, 0),
                 couleurFond),  # Donne la couleur de fond du titre de groupe
            ]

            # Formatage des lignes "Activités"
            for indexGroupe in listeIndexGroupes:
                listeStyles.append(
                    ('SPAN', (0, indexGroupe), (-1, indexGroupe)))
                listeStyles.append(('FONT', (0, indexGroupe),
                                    (-1, indexGroupe), "Helvetica-Bold", 7))
                listeStyles.append(
                    ('ALIGN', (0, indexGroupe), (-1, indexGroupe), 'LEFT'))

            # Création du tableau
            tableau = Table(dataTableau, largeursColonnes)
            tableau.setStyle(TableStyle(listeStyles))
            story.append(tableau)
            story.append(Spacer(0, 20))

        # Enregistrement du PDF
        doc.build(story)

        # Affichage du PDF
        FonctionsPerso.LanceFichierExterne(nomDoc)
Esempio n. 27
0
    def Imprimer(self, event=None):
        # Création du PDF
        from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, PageBreak
        from reportlab.platypus.flowables import ParagraphAndImage, Image
        from reportlab.rl_config import defaultPageSize
        from reportlab.lib.units import inch, cm
        from reportlab.lib.utils import ImageReader
        from reportlab.lib import colors
        from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
        self.hauteur_page = defaultPageSize[1]
        self.largeur_page = defaultPageSize[0]

        # Initialisation du PDF
        PAGE_HEIGHT = defaultPageSize[1]
        PAGE_WIDTH = defaultPageSize[0]
        nomDoc = FonctionsPerso.GenerationNomDoc("LISTE_PRESTATIONS_", "pdf")
        if sys.platform.startswith("win"): nomDoc = nomDoc.replace("/", "\\")
        doc = SimpleDocTemplate(nomDoc,
                                topMargin=30,
                                bottomMargin=30,
                                leftMargin=40,
                                rightMargin=40)
        story = []

        largeurContenu = 520

        # Création du titre du document
        dataTableau = []
        largeursColonnes = ((420, 100))
        dateDuJour = DateEngFr(str(datetime.date.today()))
        dataTableau.append(
            (_(u"Liste des prestations"), _(u"%s\nEdité le %s") %
             (UTILS_Organisateur.GetNom(), dateDuJour)))
        style = TableStyle([
            ('BOX', (0, 0), (-1, -1), 0.25, colors.black),
            ('VALIGN', (0, 0), (-1, -1), 'TOP'),
            ('ALIGN', (0, 0), (0, 0), 'LEFT'),
            ('FONT', (0, 0), (0, 0), "Helvetica-Bold", 16),
            ('ALIGN', (1, 0), (1, 0), 'RIGHT'),
            ('FONT', (1, 0), (1, 0), "Helvetica", 6),
        ])
        tableau = Table(dataTableau, largeursColonnes)
        tableau.setStyle(style)
        story.append(tableau)
        story.append(Spacer(0, 10))

        # Intro
        styleA = ParagraphStyle(name="A",
                                fontName="Helvetica",
                                fontSize=6,
                                spaceAfter=20)
        story.append(Paragraph(self.labelParametres, styleA))

        # Famille
        for dictFamille in self.listeImpression["donnees"]:

            # Init tableau
            dataTableau = []
            largeursColonnes = [220, 220, 40, 40]

            dataTableau.append((dictFamille['nom'], dictFamille['adresse'],
                                dictFamille['montant'], dictFamille['nombre']))

            # Individu
            for dictIndividu in dictFamille["individus"]:
                dataTableau.append(
                    (u"     %s (%s)" %
                     (dictIndividu["nom"], dictIndividu["date_naiss"]), "", "",
                     ""))

                # Prestations
                for dictPrestation in dictIndividu["prestations"]:
                    dataTableau.append(
                        (u"                 " + dictPrestation["label"],
                         dictPrestation["nomActivite"],
                         dictPrestation["montant"], dictPrestation["nombre"]))

            couleurFond = (0.8, 0.8, 1)
            listeStyles = [
                ('VALIGN', (0, 0), (-1, -1),
                 'MIDDLE'),  # Centre verticalement toutes les cases
                ('FONT', (0, 0), (-1, -1), "Helvetica",
                 7),  # Donne la police de caract. + taille de police 
                ('BOX', (0, 1), (-1, -1), 0.25,
                 colors.black),  # Crée la bordure noire pour tout le tableau
                ('ALIGN', (2, 0), (-1, -1),
                 'CENTRE'),  # Ligne de labels colonne alignée au centre
                ('BOX', (0, 0), (-1, 0), 0.25,
                 colors.black),  # Crée la bordure noire du nom de famille
                (
                    'FONT', (0, 0), (0, 0), "Helvetica-Bold", 8
                ),  # Donne la police de caract. + taille de police du titre de groupe
                ('BACKGROUND', (0, 0), (-1, 0),
                 couleurFond),  # Donne la couleur de fond du titre de groupe
                ('TOPPADDING', (0, 0), (-1, -1), 1),
                ('BOTTOMPADDING', (0, 0), (-1, -1), 1),
            ]

            # Création du tableau
            tableau = Table(dataTableau, largeursColonnes)
            tableau.setStyle(TableStyle(listeStyles))
            story.append(tableau)
            story.append(Spacer(0, 6))

        # TOTAUX
        dataTableau = []
        largeursColonnes = [220, 220, 40, 40]

        for ligne in self.listeImpression["totaux"]:
            dataTableau.append(ligne)

        couleurFond = (0.8, 0.8, 0.8)
        listeStyles = [
            ('VALIGN', (0, 0), (-1, -1),
             'MIDDLE'),  # Centre verticalement toutes les cases
            ('FONT', (0, 0), (-1, -1), "Helvetica",
             7),  # Donne la police de caract. + taille de police 
            ('BOX', (0, 1), (-1, -1), 0.25,
             colors.black),  # Crée la bordure noire pour tout le tableau
            ('ALIGN', (2, 0), (-1, -1),
             'CENTRE'),  # Ligne de labels colonne alignée au centre
            ('BOX', (0, 0), (-1, 0), 0.25,
             colors.black),  # Crée la bordure noire du nom de famille
            (
                'FONT', (0, 0), (0, 0), "Helvetica-Bold", 8
            ),  # Donne la police de caract. + taille de police du titre de groupe
            ('BACKGROUND', (0, 0), (-1, 0),
             couleurFond),  # Donne la couleur de fond du titre de groupe
            ('TOPPADDING', (0, 0), (-1, -1), 1),
            ('BOTTOMPADDING', (0, 0), (-1, -1), 1),
        ]

        # Création du tableau
        tableau = Table(dataTableau, largeursColonnes)
        tableau.setStyle(TableStyle(listeStyles))
        story.append(tableau)

        # Enregistrement du PDF
        doc.build(story)

        # Affichage du PDF
        FonctionsPerso.LanceFichierExterne(nomDoc)
    def ExportExcel(self, event=None):
        """ Export Excel """
        if self.mode == "attente":
            titre = _(u"Inscriptions en attente")
        else:
            titre = _(u"Inscriptions refusées")

        # Demande à l'utilisateur le nom de fichier et le répertoire de destination
        nomFichier = "ExportExcel_%s.xls" % datetime.datetime.now().strftime(
            "%Y%m%d%H%M%S")
        wildcard = "Fichier Excel (*.xls)|*.xls|" \
                        "All files (*.*)|*.*"
        sp = wx.StandardPaths.Get()
        cheminDefaut = sp.GetDocumentsDir()
        dlg = wx.FileDialog(
            None,
            message=
            _(u"Veuillez sélectionner le répertoire de destination et le nom du fichier"
              ),
            defaultDir=cheminDefaut,
            defaultFile=nomFichier,
            wildcard=wildcard,
            style=wx.FD_SAVE)
        dlg.SetFilterIndex(0)
        if dlg.ShowModal() == wx.ID_OK:
            cheminFichier = dlg.GetPath()
            dlg.Destroy()
        else:
            dlg.Destroy()
            return

        # Le fichier de destination existe déjà :
        if os.path.isfile(cheminFichier) == True:
            dlg = wx.MessageDialog(
                None,
                _(u"Un fichier portant ce nom existe déjà. \n\nVoulez-vous le remplacer ?"
                  ), "Attention !",
                wx.YES_NO | wx.NO_DEFAULT | wx.ICON_EXCLAMATION)
            if dlg.ShowModal() == wx.ID_NO:
                return False
                dlg.Destroy()
            else:
                dlg.Destroy()

        # Export
        import pyExcelerator
        # Création d'un classeur
        wb = pyExcelerator.Workbook()
        # Création d'une feuille
        ws1 = wb.add_sheet(titre)

        fntLabel = pyExcelerator.Font()
        fntLabel.name = 'Verdana'
        fntLabel.bold = True

        al = pyExcelerator.Alignment()
        al.horz = pyExcelerator.Alignment.HORZ_LEFT
        al.vert = pyExcelerator.Alignment.VERT_CENTER

        ar = pyExcelerator.Alignment()
        ar.horz = pyExcelerator.Alignment.HORZ_RIGHT
        ar.vert = pyExcelerator.Alignment.VERT_CENTER

        pat = pyExcelerator.Pattern()
        pat.pattern = pyExcelerator.Pattern.SOLID_PATTERN
        pat.pattern_fore_colour = 0x01F

        styleDate = pyExcelerator.XFStyle()
        styleDate.alignment = al
        styleDate.font.bold = True

        # Entetes et largeurs des colonnes
        colonnes = [
            (_(u"Date"), 8000),
            (_(u"Groupe"), 8000),
            (_(u"Dispo"), 2000),
            (_(u"N°"), 2000),
            (_(u"Individu"), 10000),
            (_(u"Date de saisie"), 10000),
            (_(u"Catégorie de tarif"), 10000),
        ]
        index = 0
        for label, largeur in colonnes:
            ws1.col(index).width = largeur
            ws1.write(0, index, label)
            index += 1

        # Contenu
        x = 1
        for date, listeGroupes in self.listeImpression:
            for nomGroupe, listeIndividus in listeGroupes:
                for dictIndividu in listeIndividus:
                    placeDispo = dictIndividu["placeDispo"]
                    if placeDispo == True:
                        placeDispoTxt = _(u"Oui")
                    else:
                        placeDispo = ""

                    ws1.write(x, 0, date, styleDate)
                    ws1.write(x, 1, nomGroupe)
                    ws1.write(x, 2, placeDispo)
                    ws1.write(x, 3, dictIndividu["num"])
                    ws1.write(x, 4, dictIndividu["nomIndividu"])
                    ws1.write(x, 5, dictIndividu["texteDateSaisie"])
                    ws1.write(x, 6, dictIndividu["nomCategorie"])

                    x += 1

        # Finalisation du fichier xls
        wb.save(cheminFichier)

        # Confirmation de création du fichier et demande d'ouverture directe dans Excel
        txtMessage = _(
            u"Le fichier Excel a été créé avec succès. Souhaitez-vous l'ouvrir dès maintenant ?"
        )
        dlgConfirm = wx.MessageDialog(
            None, txtMessage, _(u"Confirmation"),
            wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION)
        reponse = dlgConfirm.ShowModal()
        dlgConfirm.Destroy()
        if reponse == wx.ID_NO:
            return
        else:
            FonctionsPerso.LanceFichierExterne(cheminFichier)
Esempio n. 29
0
    def ExportExcel(self, event=None):
        """ Export Excel """
        titre = _(u"Evènements")

        # Demande à l'utilisateur le nom de fichier et le répertoire de destination
        nomFichier = "ExportExcel_%s.xlsx" % datetime.datetime.now().strftime(
            "%Y%m%d%H%M%S")
        wildcard = "Fichier Excel (*.xlsx)|*.xlsx|" \
                        "All files (*.*)|*.*"
        sp = wx.StandardPaths.Get()
        cheminDefaut = sp.GetDocumentsDir()
        dlg = wx.FileDialog(
            None,
            message=
            _(u"Veuillez sélectionner le répertoire de destination et le nom du fichier"
              ),
            defaultDir=cheminDefaut,
            defaultFile=nomFichier,
            wildcard=wildcard,
            style=wx.FD_SAVE)
        dlg.SetFilterIndex(0)
        if dlg.ShowModal() == wx.ID_OK:
            cheminFichier = dlg.GetPath()
            dlg.Destroy()
        else:
            dlg.Destroy()
            return

        # Le fichier de destination existe déjà :
        if os.path.isfile(cheminFichier) == True:
            dlg = wx.MessageDialog(
                None,
                _(u"Un fichier portant ce nom existe déjà. \n\nVoulez-vous le remplacer ?"
                  ), "Attention !",
                wx.YES_NO | wx.NO_DEFAULT | wx.ICON_EXCLAMATION)
            if dlg.ShowModal() == wx.ID_NO:
                return False
                dlg.Destroy()
            else:
                dlg.Destroy()

        # Export
        import xlsxwriter
        classeur = xlsxwriter.Workbook(cheminFichier)
        feuille = classeur.add_worksheet()

        format_money = classeur.add_format({'num_format': '# ##0.00'})
        format_money_titre = classeur.add_format({
            'num_format': '# ##0.00',
            'bold': True,
            'bg_color': '#E7EAED'
        })
        format_titre = classeur.add_format({
            'align': 'center',
            'bold': True,
            'bg_color': '#E7EAED'
        })

        # Création des labels de colonnes
        x = 0
        y = 0
        for valeur in self.dictImpression["entete"]:
            feuille.write(x, y, valeur)
            feuille.set_column(y, y, 15)
            y += 1
        feuille.set_column(0, 0, 50)

        def RechercheFormat(valeur, titre):
            """ Recherche si la valeur est un nombre """
            format = None
            # Si c'est un nombre
            try:
                nbre = float(valeur)
                if titre == True:
                    format = format_titre
                return (nbre, format)
            except:
                pass

            return False, None

        # Contenu
        x = 1
        y = 0
        for ligne in self.dictImpression["contenu"]:
            for valeur in ligne:

                # Recherche si c'est un titre
                if x - 1 in self.dictImpression["coloration"]:
                    titre = True
                else:
                    titre = False

                # Recherche s'il y a un format de nombre ou de montant
                nbre, format = RechercheFormat(valeur, titre)
                if nbre != False:
                    valeur = nbre

                if nbre == False and titre == True and format == None:
                    format = format_titre

                # Enregistre la valeur
                if format != None:
                    feuille.write(x, y, valeur, format)
                else:
                    feuille.write(x, y, valeur)

                y += 1
            x += 1
            y = 0

        # Total
        premiereLigne = True
        for ligne in self.dictImpression["total"]:
            for valeur in ligne:

                # Recherche si c'est un titre
                if premiereLigne == True:
                    titre = True
                else:
                    titre = False

                # Recherche s'il y a un format de nombre ou de montant
                nbre, format = RechercheFormat(valeur, titre)
                if nbre != False:
                    valeur = nbre

                if nbre == False and titre == True and format == None:
                    format = format_titre

                # Enregistre la valeur
                if format != None:
                    feuille.write(x, y, valeur, format)
                else:
                    feuille.write(x, y, valeur)

                y += 1
            premiereLigne = False
            x += 1
            y = 0

        # Finalisation du fichier xlsx
        classeur.close()

        # Confirmation de création du fichier et demande d'ouverture directe dans Excel
        txtMessage = _(
            u"Le fichier Excel a été créé avec succès. Souhaitez-vous l'ouvrir dès maintenant ?"
        )
        dlgConfirm = wx.MessageDialog(
            None, txtMessage, _(u"Confirmation"),
            wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION)
        reponse = dlgConfirm.ShowModal()
        dlgConfirm.Destroy()
        if reponse == wx.ID_NO:
            return
        else:
            FonctionsPerso.LanceFichierExterne(cheminFichier)
Esempio n. 30
0
 def OnLinkClicked(self, link):
     FonctionsPerso.LanceFichierExterne(
         _(u"http://teamworks.forumactif.com/"))