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)
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)
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
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)
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()
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 (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)
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)
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)
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)
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)
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)
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)
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)
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"")
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)
def OnLinkClicked(self, link): FonctionsPerso.LanceFichierExterne(_(u"http://www.noethys.com"))
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)
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)
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)
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)
def OnLinkClicked(self, link): FonctionsPerso.LanceFichierExterne( _(u"http://teamworks.forumactif.com/"))