Beispiel #1
0
def SqlMouvementsPeriode(debut=None,fin=None):
    # retourne une  liste de mouvements en forme de liste
    lstChamps = ['date','origine','stMouvements.IDarticle','qte','prixUnit','IDmouvement']
    if fin == None: fin = datetime.date.today()
    if debut == None: debut = fin - datetime.timedelta(days=180)
    finIso = xformat.DatetimeToStr(fin,iso=True)
    debutIso = xformat.DatetimeToStr(debut,iso=True)
    db = xdb.DB()
    # Appelle les mouvements de la période
    req = """   SELECT %s
                FROM stMouvements
                WHERE   (   (date > '%s' ) 
                            AND (date <= '%s' ))
                ;""" % (",".join(lstChamps),debutIso,finIso)

    retour = db.ExecuterReq(req, mess='UTILS_Stocks.SqlMouvementsPeriode')
    llMouvements = []
    if retour == "ok":
        recordset = db.ResultatReq()
        for record in recordset:
            mouvement = []
            for ix  in range(len(lstChamps)):
                mouvement.append(record[ix])
            llMouvements.append(mouvement)
    db.Close()
    return llMouvements
Beispiel #2
0
def MajDepot(dlg, db, IDdepot):
    modes = ""
    mindte, maxdte = datetime.date(2999, 12, 31), datetime.date(2000, 1, 1)

    nb = len(dlg.ctrlOlv.modelObjects)
    for track in dlg.ctrlOlv.modelObjects:
        if track.mode and len(track.mode) > 0:
            if not track.mode[:3] in modes: modes += track.mode[:3] + ', '
        mindte = min(mindte, track.date)
        maxdte = max(maxdte, track.date)
    if mindte == maxdte:
        dates = "le %s" % (xformat.DatetimeToStr(mindte, iso=False))
    else:
        dates = "du %s au %s" % (xformat.DatetimeToStr(
            mindte, iso=False), xformat.DatetimeToStr(maxdte, iso=False))
    label = "Noelite: %d %s datés %s" % (nb, modes, dates)

    lstDonnees = [
        ("date", xformat.DateFrToSql(dlg.pnlParams.ctrlDate.GetValue())),
        ("nom", label),
        ("IDcompte", dlg.GetIDbanque()),
    ]
    # Mise à jour du libellé dépôt
    db.ReqMAJ('depots', lstDonnees, 'IDdepot', IDdepot, affichError=True)
    return
Beispiel #3
0
def SetDepot(dlg, db):
    # cas d'un nouveau depot à créer, retourne l'IDdepot
    IDdepot = None
    today = xformat.DatetimeToStr(datetime.date.today(), iso=False)
    if not 'userdomain' in dlg.dictUtilisateur.keys():
        dlg.dictUtilisateur['userdomain'] = '_'
        dlg.dictUtilisateur['config'] = '_'

    label = "saisie '%s' sur '%s' via '%s' le %s" % (
        dlg.dictUtilisateur['utilisateur'], dlg.dictUtilisateur['userdomain'],
        dlg.dictUtilisateur['config'], today)
    lstDonnees = [("date",
                   xformat.DateFrToSql(dlg.pnlParams.ctrlDate.GetValue())),
                  ("nom", "Saisie règlements via Noelite"),
                  ("verrouillage", 0), ("IDcompte", dlg.GetIDbanque()),
                  ("observations", label)]
    if not hasattr(dlg, "IDdepot"):
        ret = db.ReqInsert(
            "depots",
            lstDonnees=lstDonnees,
            mess="UTILS_Reglements.SetDepot",
        )
        if ret == 'ok':
            IDdepot = db.newID

    # affichage de l'IDdepot créé
    dlg.pnlParams.ctrlRef.SetValue(str(IDdepot))
    return IDdepot
Beispiel #4
0
def SqlLastInventaire(cloture=None):
    # retourne l'inventaire précédent la date de cloture
    if cloture == None:
        cloture = datetime.date.today()
    db = xdb.DB()
    # Appelle l'inventaire précédent
    lstChamps = ['IDdate','IDarticle','qteStock','prixMoyen',]
    finIso = xformat.DatetimeToStr(cloture,iso=True)
    req = """   SELECT %s
                FROM stInventaires
                WHERE   (stInventaires.IDdate = 
                            (SELECT MAX(stInv.IDdate) 
                            FROM stInventaires as stInv
                            WHERE stInv.IDdate < '%s')
                        )
                ;""" % (",".join(lstChamps),finIso)

    retour = db.ExecuterReq(req, mess='UTILS_Stocks.SqlLastInventaire')
    llInventaire = []
    if retour == "ok":
        recordset = db.ResultatReq()
        for record in recordset:
            mouvement = []
            for ix  in range(len(lstChamps)):
                mouvement.append(record[ix])
            llInventaire.append(mouvement)
    db.Close()
    return llInventaire
Beispiel #5
0
def PostInventaire(cloture=datetime.date.today(),inventaire=[[],]):
    # delete puis recrée l'inventaire à la date de cloture
    if cloture == None:
        cloture = datetime.date.today()
    ordi = os.environ['USERDOMAIN']
    dteSaisie = xformat.DatetimeToStr(datetime.date.today(),iso=True)
    # Appelle l'inventaire précédent
    lstChamps = ['IDdate',
                 'IDarticle',
                 'qteStock',
                 'prixMoyen',
                 'prixActuel',
                 'ordi',
                 'dateSaisie',]
    llDonnees = []
    # lignes reçues [date,article,qte,prixMoyen,montant,lastPrix]
    for dte,article,qte,pxMoy,mtt,pxLast in inventaire:
        if dte != str(cloture): raise Exception(
            "cloture = %s diff de inventaire = %s"%(str(cloture),str(dte)))
        llDonnees.append([dte,article,qte,pxMoy,pxLast,ordi,dteSaisie])

    # test présence inventaire
    db = xdb.DB()
    finIso = xformat.DatetimeToStr(cloture,iso=True)
    condition = "stInventaires.IDdate = '%s'"%finIso
    req = """   SELECT *
                FROM stInventaires
                WHERE %s
                ;""" %(condition)

    retour = db.ExecuterReq(req, mess='UTILS_Stocks.testPrésenceInventaire')
    if retour == "ok":
        recordset = db.ResultatReq()
        if len(recordset) > 0:
            mess = "UTILS_Stoks.PostInventaire.ReqDel"
            ret = db.ReqDEL('stInventaires',condition=condition,mess=mess)

    ret = db.ReqInsert('stInventaires',lstChamps=lstChamps,lstlstDonnees=llDonnees,
                 mess="UTILS_Stocks.PostInventaires")
    db.Close()
    if ret == 'ok':
        return True
    return ret
Beispiel #6
0
    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 = xformat.DatetimeToStr(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, six.text_type):
            if len(valeur) == 10:
                if valeur[2] == "/" and valeur[5] == "/":
                    return (valeur, styleDate)
                if valeur[4] == "-" and valeur[7] == "-":
                    return (xformat.DateSqlToIso(valeur), styleDate)

        return str(valeur), None
Beispiel #7
0
    def SetComposants(self,IDimmo,lstNews,lstCancels,lstModifs,lstChamps):
        champs = lstChamps + ['dtMaj','user']
        donUser = [xformat.DatetimeToStr(datetime.date.today(), iso=True),
                   self.GetUser()]

        # écriture des composants d'une immo particulière dans la base de donnée
        for donnees in lstNews:
            donnees += donUser
            donnees[1] = IDimmo
            self.db.ReqInsert('immosComposants',champs[1:],[donnees[1:],],mess="U_Noegest.SetComposants_ins")
        for donnees in lstCancels:
            self.db.ReqDEL('immosComposants','IDcomposant',donnees[0],mess="U_Noegest.SetComposants_del")
        for donnees in lstModifs:
            donnees += donUser
            self.db.ReqMAJ('immosComposants',nomChampID='IDcomposant',ID=donnees[0],lstChamps=champs[1:],
                           lstValues=donnees[1:], mess="U_Noegest.SetComposants_maj")
        return
Beispiel #8
0
    def CalculInventaire(self, fin=None):
        # retourne un inventaire: liste de liste
        if fin == None: fin = self.cloture

        debut = None
        if self.lastInventaire:
            # présence d'un inventaire antérieur
            debut = xformat.DateSqlToDatetime(self.lastInventaire[0][0])

        #['jour', 'origine', 'nomArticle', 'qteMouvement','prixUnit']
        llMouvements = GetMouvements(debut=debut, fin=fin)
        self._xAjoutInventaire(llMouvements)

        # liste préalable pour traitement par article
        lstArticles = []
        for jour, origine, article, qte, pu, id in llMouvements:
            if not article:
                raise Exception("Article disparu! mvt du %s qte= %d" %
                                (jour, qte))
            if not article in lstArticles:
                lstArticles.append(article)
        lstArticles.sort()
        if lstArticles == None:
            raise Exception("Aucun mouvement dans la période du %s au %s"\
                  %(debut,fin))

        # composition de l'inventaire
        llinventaire = []
        for article in lstArticles:
            lstMvts = [x[0:2] + x[3:] for x in llMouvements if x[2] == article]
            qte, mtt, lastPrix = self._CalculInventaireUnArticle(lstMvts)
            if qte == 0:
                pu = 0.0
            else:
                pu = round(mtt / qte, 4)
            if qte != 0 and mtt != 0:
                # compose [dte,article,qte,prixMoyen,montant,lastPrix]
                llinventaire.append([
                    xformat.DatetimeToStr(fin, iso=True),
                    article,
                    round(qte, 4),
                    pu,
                    round(mtt, 4),
                    lastPrix,
                ])
        return llinventaire
Beispiel #9
0
    def SetConsoKm(self,track):
        # --- Sauvegarde de la ligne consommation ---
        dteFacturation = self.GetParam('filtres','datefact')
        if track.observation == None: track.observation = ""
        if track.typetiers != 'A' and track.nomtiers and len(track.nomtiers.strip())>0:
            if not (track.nomtiers.strip() in track.observation):
                track.nomtiers = track.nomtiers.replace('/','-')
                track.observation = "%s / %s"%(track.nomtiers.strip(),track.observation.strip())
        if track.idactivite == None: track.idactivite = ''

        lstDonnees = [
            ("IDconso", track.IDconso),
            ("IDanalytique", track.idvehicule),
            ("cloture", xformat.DateFrToSql(self.cloture)),
            ("typeTiers", track.typetiers[:1]),
            ("IDtiers", track.idactivite),
            ("dteKmDeb", xformat.DateFrToSql(track.datekmdeb)),
            ("kmDeb", track.kmdeb),
            ("dteKmFin", xformat.DateFrToSql(track.datekmfin)),
            ("kmFin", track.kmfin),
            ("observation", track.observation),
            ("dtFact", xformat.DateFrToSql(dteFacturation)),
            ("dtMaj", xformat.DatetimeToStr(datetime.date.today(),iso=True)),
            ("user", self.GetUser()),
            ]

        if not track.IDconso or track.IDconso == 0:
            ret = self.db.ReqInsert("vehiculesConsos",lstDonnees= lstDonnees[1:], mess="UTILS_Noegest.SetConsoKm")
            track.IDconso = self.db.newID
            IDcategorie = 6
            categorie = ("Saisie")
        else:
            ret = self.db.ReqMAJ("vehiculesConsos", lstDonnees, "IDconso", track.IDconso)
            IDcategorie = 7
            categorie = "Modification"
        """
        # --- Mémorise l'action dans l'historique ---
        if ret == 'ok':
            nuh.InsertActions([{
                                "IDcategorie": IDcategorie,
                                "action": "Noelite %s de la conso ID%d : %s %s %s" % (
                                categorie, track.IDconso, track.nomvehicule,track.nomtiers,track.observation,),
                                }, ],db=self.db)
        """
        return ret
Beispiel #10
0
def SetReglement(dlg, track, db):
    # --- Sauvegarde du règlement ---
    IDemetteur = None
    IDpayeur = None
    if not hasattr(track, 'IDprestation'): track.IDprestation = None

    # transposition du payeur en son ID
    if not hasattr(dlg.pnlOlv, 'ldPayeurs'):
        dlg.pnlOlv.ldPayeurs = GetPayeurs(db, track.IDfamille)
    for dicPayeur in dlg.pnlOlv.ldPayeurs:
        if track.payeur in dicPayeur['nom']:
            IDpayeur = dicPayeur['IDpayeur']
            break
    if not IDpayeur:
        IDpayeur = SetPayeur(db, track.IDfamille, track.payeur)
        dlg.pnlOlv.ldPayeurs = GetPayeurs(db, track.IDfamille)

    IDmode = dlg.dicModesChoices[track.mode]['IDmode']

    # transposition de l'émetteur en son ID
    lstEmetteurs = dlg.dlEmetteurs[IDmode]
    if len(lstEmetteurs
           ) >= 0 and track.emetteur and track.emetteur in lstEmetteurs:
        IDemetteur = dlg.dlIDemetteurs[IDmode][lstEmetteurs.index(
            track.emetteur)]
    else:
        track.emetteur = None
        ixem = dlg.ctrlOlv.lstCodesColonnes.index('emetteur')
        track.donnees[ixem]
    if not track.libelle: track.libelle = ""
    if not track.numero: track.numero = ""

    lstDonnees = [
        ("IDreglement", track.IDreglement),
        ("IDcompte_payeur", track.IDfamille),
        ("date", xformat.DatetimeToStr(track.date, iso=True)),
        ("IDmode", IDmode),
        ("IDemetteur", IDemetteur),
        ("numero_piece", track.numero),
        ("montant", track.montant),
        ("IDpayeur", IDpayeur),
        ("observations", track.libelle),
        ("IDcompte", dlg.GetIDbanque()),
        ("date_saisie", xformat.DatetimeToStr(datetime.date.today(),
                                              iso=True)),
        ("IDutilisateur", dlg.IDutilisateur),
        ("IDpiece", track.IDprestation),
    ]
    if dlg.withDepot:
        lstDonnees.append(("IDdepot", dlg.IDdepot))
    if hasattr(track, 'differe'):
        lstDonnees.append(
            ("date_differe", xformat.DatetimeToStr(track.differe, iso=True)))

    if track.IDreglement in dlg.pnlOlv.lstNewReglements:
        nouveauReglement = True
        ret = db.ReqInsert("reglements",
                           lstDonnees=lstDonnees,
                           mess="UTILS_Reglements.SetReglement")
        dlg.pnlOlv.lstNewReglements.remove(track.IDreglement)
    else:
        nouveauReglement = False
        ret = db.ReqMAJ("reglements", lstDonnees, "IDreglement",
                        track.IDreglement)

    # --- Mémorise l'action dans l'historique ---
    if ret == 'ok':
        if nouveauReglement == True:
            IDcategorie = 6
            categorie = ("Saisie")
        else:
            IDcategorie = 7
            categorie = "Modification"
        texteMode = track.mode
        if track.numero != "":
            texteNumpiece = u" n°%s" % track.numero
        else:
            texteNumpiece = u""
        if texteNumpiece == "":
            texteDetail = u""
        else:
            texteDetail = u"- %s - " % (texteNumpiece)

        montant = u"%.2f %s" % (track.montant, SYMBOLE)
        textePayeur = track.payeur
        if not isinstance(track.IDreglement, int):
            raise Exception('anomalie: IDreglement = %s' % track.IDreglement)
        nuh.InsertActions([
            {
                "IDfamille":
                track.IDfamille,
                "IDcategorie":
                IDcategorie,
                "action":
                "Noelite %s du règlement ID%d : %s en %s %spayé par %s" %
                (categorie, track.IDreglement, montant, texteMode, texteDetail,
                 textePayeur),
            },
        ],
                          db=db)
    return True
Beispiel #11
0
def SetPrestation(track, db):
    # --- Sauvegarde de la prestation ---
    if not track.nature.lower() in ('don', 'donsscerfa', 'debour'):
        raise Exception("UTILS_Reglements.SetPrestation ni don ni debour!!")
    lstDonnees = [
        ("date", xformat.DatetimeToStr(datetime.date.today(), iso=True)),
        ("categorie", track.nature),
        ("label", track.libelle),
        ("montant_initial", track.montant),
        ("montant", track.montant),
        ("IDcompte_payeur", track.IDfamille),
        ("code_compta", track.compte),
        ("IDfamille", track.IDfamille),
        ("IDindividu", 0),
    ]

    if (not hasattr(track, "IDprestation")) or (not track.IDprestation):
        ret = db.ReqInsert(
            "prestations",
            lstDonnees=lstDonnees,
            mess="UTILS_Reglements.SetPrestation",
        )
        IDcategorie = 6
        categorie = ("Saisie")
        if ret == 'ok':
            track.IDprestation = db.newID
    else:
        ret = db.ReqMAJ("prestations", lstDonnees, "IDprestation",
                        track.IDprestation)
        IDcategorie = 7
        categorie = "Modification"
    IDprestation = track.IDprestation

    # supprime les ventilations du règlement
    ret = db.ReqDEL("ventilation", "IDreglement", track.IDreglement)

    # création d'une ventilation
    lstDonnees = [('IDprestation', IDprestation),
                  ('IDreglement', track.IDreglement),
                  ('montant', track.montant),
                  ('IDcompte_payeur', track.IDfamille)]
    ret = db.ReqInsert(
        "ventilation",
        lstDonnees=lstDonnees,
        mess="UTILS_Reglements.SetPrestation.ventilation",
    )

    # mise à jour du règlement sur son numéro de pièce (ID de la prestation
    lstDonnees = [("IDpiece", IDprestation)]
    ret = db.ReqMAJ("reglements", lstDonnees, "IDreglement", track.IDreglement)

    # --- Mémorise l'action dans l'historique ---
    if ret == 'ok':
        texteMode = track.mode
        montant = u"%.2f %s" % (track.montant, SYMBOLE)
        if not IDprestation: IDprest = 0
        else: IDprest = IDprestation
        nuh.InsertActions([
            {
                "IDfamille":
                track.IDfamille,
                "IDcategorie":
                IDcategorie,
                "action":
                "Noelite %s de prestation associée regl ID%d : %s en %s " %
                (categorie, IDprest, montant, track.libelle),
            },
        ],
                          db=db)
    return IDprestation
Beispiel #12
0
         'txtSize': 90
     },
     {
         'name':
         'date',
         'genre':
         'Texte',
         'label':
         "",
         'help':
         "%s\n%s\n%s" %
         ("Saisie JJMMAA ou JJMMAAAA possible.",
          "Les séparateurs ne sont pas obligatoires en saisie.",
          "Saisissez la date de l'entrée en stock sans séparateurs, "),
         'value':
         xformat.DatetimeToStr(datetime.date.today()),
         'ctrlAction':
         'OnDate',
         'ctrlMaxSize': (220, 35),
         'txtSize':
         90
     },
 ],
 ("param2", "Comptes"): [{
     'name': 'fournisseur',
     'genre': 'Combo',
     'label': 'Fournisseur',
     'help':
     "La saisie d'un fournisseurfacilite les commandes par fournisseur, on peut mettre 'NONAME'",
     'value': 0,
     'values': [''],
Beispiel #13
0
    def InitParametres(self):
        """ Récupération des paramètres d'impression """
        # DLG des paramètres d'impression
        dictOptions = {
            "titre": self.titre,
            "introduction": self.intro,
            "conclusion": self.total,
            "orientation": self.orientation,
        }
        dlg = OptionsImpression.Dialog(None, dictOptions=dictOptions)
        if dlg.ShowModal() == wx.OK:
            dictOptions = dlg.GetOptions()
            dlg.Destroy()
        else:
            dlg.Destroy()
            return False

        # Remplacement des mots-clés
        lstChamps = [
            "pied_page_texte_gauche", "pied_page_texte_milieu",
            "pied_page_texte_droite"
        ]
        for key, valeur in dictOptions.items():
            if key in lstChamps:
                valeur = valeur.replace(
                    "{DATE_JOUR}",
                    xformat.DatetimeToStr(datetime.date.today()))
                valeur = valeur.replace("{TITRE_DOCUMENT}", self.titre)
                valeur = valeur.replace("{NUM_PAGE}", "%(currentPage)d")
                valeur = valeur.replace("{NBRE_PAGES}", "%(totalPages)d")
                dictOptions[key] = valeur

        # Préparation du printout
        self.printer = ListCtrlPrinter.LCprinter(self.listview,
                                                 dictOptions["titre"])
        self.printer.printout.margins = (wx.Point(dictOptions["marge_gauche"],
                                                  dictOptions["marge_haut"]),
                                         wx.Point(dictOptions["marge_droite"],
                                                  dictOptions["marge_bas"]))
        self.printer.printout.printData.SetOrientation(
            dictOptions["orientation"])
        self.printer.printout.printData.SetQuality(
            dictOptions["qualite_impression"])
        self.printer.PageFooter = (dictOptions["pied_page_texte_gauche"],
                                   dictOptions["pied_page_texte_milieu"],
                                   dictOptions["pied_page_texte_droite"])
        ListCtrlPrinter.LISTINTRO = dictOptions["introduction"]
        ListCtrlPrinter.LISTFOOTER = dictOptions["conclusion"]

        # Préparation du format
        fmt = ReportFormat()

        # Entête de page
        ##        fmt.PageHeader.Font = wx.FFont(10, wx.FONTFAMILY_DECORATIVE, wx.FONTFLAG_BOLD, face=headerFontName)
        ##        fmt.PageHeader.TextColor = wx.WHITE
        ##        fmt.PageHeader.Background(wx.GREEN, wx.RED, space=(16, 4, 0, 4))
        ##        fmt.PageHeader.Padding = (0, 0, 0, 12)

        # Titre de liste
        fmt.ListHeader.Font = wx.Font(dictOptions["titre_taille_texte"],
                                      wx.SWISS,
                                      wx.NORMAL,
                                      dictOptions["titre_style"],
                                      faceName="Arial")
        fmt.ListHeader.TextColor = dictOptions["titre_couleur"]
        fmt.ListHeader.Padding = (0, 12, 0, 10)
        fmt.ListHeader.TextAlignment = dictOptions["titre_alignement"]
        fmt.ListHeader.Frame(wx.Pen(wx.BLACK, 0.25, wx.SOLID), space=10)

        # Intro
        fmt.ListIntro.Font = wx.Font(dictOptions["intro_taille_texte"],
                                     wx.SWISS,
                                     wx.NORMAL,
                                     dictOptions["intro_style"],
                                     faceName="Arial")
        fmt.ListIntro.TextColor = dictOptions["intro_couleur"]
        fmt.ListIntro.Padding = (12, 2, 12, 2)
        fmt.ListIntro.TextAlignment = dictOptions["intro_alignement"]
        fmt.ListIntro.CanWrap = True

        # Titre de colonne
        fmt.ColumnHeader.Font = wx.Font(
            dictOptions["titre_colonne_taille_texte"],
            wx.SWISS,
            wx.NORMAL,
            dictOptions["titre_colonne_style"],
            faceName="Arial")
        fmt.ColumnHeader.TextColor = dictOptions["titre_colonne_couleur"]
        fmt.ColumnHeader.Padding = (0, 15, 0, 0)
        fmt.ColumnHeader.Background(dictOptions["titre_colonne_couleur_fond"])
        fmt.ColumnHeader.CellPadding = 5
        fmt.ColumnHeader.TextAlignment = dictOptions[
            "titre_colonne_alignement"]
        fmt.ColumnHeader.GridPen = wx.Pen(
            dictOptions["grille_trait_couleur"],
            dictOptions["grille_trait_epaisseur"], wx.SOLID)
        fmt.ColumnHeader.SetAlwaysCenter(True)

        # Titre d'un groupe
        fmt.GroupTitle.Font = wx.FFont(10,
                                       wx.FONTFAMILY_SWISS,
                                       wx.FONTFLAG_BOLD,
                                       faceName="Arial")
        fmt.GroupTitle.Padding = (2, 10, 2, 2)
        fmt.GroupTitle.CellPadding = 12
        fmt.GroupTitle.GridPen = wx.Pen(dictOptions["grille_trait_couleur"],
                                        dictOptions["grille_trait_epaisseur"],
                                        wx.SOLID)

        # Ligne
        fmt.Row.Font = wx.Font(dictOptions["ligne_taille_texte"],
                               wx.SWISS,
                               wx.NORMAL,
                               dictOptions["ligne_style"],
                               faceName="Arial")
        fmt.Row.TextColor = dictOptions["ligne_couleur"]
        fmt.Row.CellPadding = 5
        fmt.Row.GridPen = wx.Pen(dictOptions["grille_trait_couleur"],
                                 dictOptions["grille_trait_epaisseur"],
                                 wx.SOLID)
        fmt.Row.CanWrap = dictOptions["ligne_multilignes"]

        # Pied de page
        fmt.PageFooter.Font = wx.Font(dictOptions["pied_page_taille_texte"],
                                      wx.SWISS,
                                      wx.NORMAL,
                                      dictOptions["pied_page_style"],
                                      faceName="Arial")
        fmt.PageFooter.TextColor = dictOptions["pied_page_couleur"]
        fmt.PageFooter.Line(wx.TOP, wx.BLACK, 1, space=3)
        fmt.PageFooter.Padding = (0, 16, 0, 0)

        # Pied de colonne
        fmt.ColumnFooter.Font = wx.Font(
            dictOptions["pied_colonne_taille_texte"],
            wx.SWISS,
            wx.NORMAL,
            dictOptions["pied_colonne_style"],
            faceName="Arial")
        fmt.ColumnFooter.TextColor = dictOptions["pied_colonne_couleur"]
        fmt.ColumnFooter.Padding = (0, 0, 0, 0)
        fmt.ColumnFooter.Background(dictOptions["pied_colonne_couleur_fond"])
        fmt.ColumnFooter.CellPadding = 5
        fmt.ColumnFooter.TextAlignment = dictOptions["pied_colonne_alignement"]
        fmt.ColumnFooter.GridPen = wx.Pen(
            dictOptions["grille_trait_couleur"],
            dictOptions["grille_trait_epaisseur"], wx.SOLID)

        # Conclusion
        fmt.ListFooter.Font = wx.Font(dictOptions["conclusion_taille_texte"],
                                      wx.SWISS,
                                      wx.NORMAL,
                                      dictOptions["conclusion_style"],
                                      faceName="Arial")
        fmt.ListFooter.TextColor = dictOptions["conclusion_couleur"]
        fmt.ListFooter.Padding = (12, 12, 0, 0)
        fmt.ListFooter.CellPadding = 5
        ##        fmt.ListFooter.Line(wx.TOP, wx.BLACK, 1, space=3)
        fmt.ListFooter.TextAlignment = dictOptions["conclusion_alignement"]
        fmt.ListFooter.CanWrap = True

        # Divers paramètres
        fmt.IsShrinkToFit = True
        fmt.IncludeImages = dictOptions["inclure_images"]
        fmt.IsColumnHeadingsOnEachPage = dictOptions["entetes_toutes_pages"]
        fmt.UseListCtrlTextFormat = True

        self.printer.ReportFormat = fmt
        return True