コード例 #1
0
    def __init__(self):
        """ Récupération de toutes les données de base """

        DB = GestionDB.DB()

        # Récupération des infos sur l'organisme
        req = """SELECT nom, rue, cp, ville, tel, fax, mail, site, num_agrement, num_siret, code_ape
        FROM organisateur
        WHERE IDorganisateur=1;"""
        DB.ExecuterReq(req)
        listeDonnees = DB.ResultatReq()
        self.dictOrganisme = {}
        for nom, rue, cp, ville, tel, fax, mail, site, num_agrement, num_siret, code_ape in listeDonnees:
            self.dictOrganisme["nom"] = nom
            self.dictOrganisme["rue"] = rue
            self.dictOrganisme["cp"] = cp
            if ville != None: ville = ville.capitalize()
            self.dictOrganisme["ville"] = ville
            self.dictOrganisme["tel"] = tel
            self.dictOrganisme["fax"] = fax
            self.dictOrganisme["mail"] = mail
            self.dictOrganisme["site"] = site
            self.dictOrganisme["num_agrement"] = num_agrement
            self.dictOrganisme["num_siret"] = num_siret
            self.dictOrganisme["code_ape"] = code_ape

        DB.Close()

        # Get noms Titulaires et individus
        self.dictTitulaires = UTILS_Titulaires.GetTitulaires()
        self.dictIndividus = UTILS_Titulaires.GetIndividus()

        # Récupération des infos de base individus et familles
        self.infosIndividus = UTILS_Infos_individus.Informations()

        # Récupération des questionnaires
        self.Questionnaires_familles = UTILS_Questionnaires.ChampsEtReponses(
            type="famille")
        self.Questionnaires_locations = UTILS_Questionnaires.ChampsEtReponses(
            type="location")
        self.Questionnaires_produits = UTILS_Questionnaires.ChampsEtReponses(
            type="produit")
コード例 #2
0
def GetListePiecesManquantes(dateReference=None,
                             listeActivites=None,
                             presents=None,
                             concernes=False):
    if dateReference == None:
        dateReference = datetime.date.today()

    # Récupération des données
    dictItems = {}

    # Conditions Activites
    if listeActivites == None or listeActivites == []:
        conditionActivites = ""
    else:
        if len(listeActivites) == 1:
            conditionActivites = " AND consommations.IDactivite=%d" % listeActivites[
                0]
        else:
            conditionActivites = " AND consommations.IDactivite IN %s" % str(
                tuple(listeActivites))

    # Conditions Présents


##    if presents == None :
##        conditionPresents = ""
##        jonctionPresents = ""
##    else:
##        conditionPresents = " AND (consommations.date>='%s' AND consommations.date<='%s')" % (str(presents[0]), str(presents[1]))
##        jonctionPresents = "LEFT JOIN consommations ON consommations.IDindividu = individus.IDindividu"

    DB = GestionDB.DB()

    # Récupération des pièces à fournir

    ## # Ancienne Version moins rapide :
    ##    req = """
    ##    SELECT
    ##    inscriptions.IDfamille, pieces_activites.IDtype_piece, types_pieces.nom, types_pieces.public, types_pieces.valide_rattachement, individus.prenom, individus.IDindividu
    ##    FROM pieces_activites
    ##    LEFT JOIN types_pieces ON types_pieces.IDtype_piece = pieces_activites.IDtype_piece
    ##    LEFT JOIN inscriptions ON inscriptions.IDactivite = pieces_activites.IDactivite
    ##    LEFT JOIN individus ON individus.IDindividu = inscriptions.IDindividu
    ##    %s
    ##    WHERE inscriptions.parti=0 %s %s
    ##    GROUP BY inscriptions.IDfamille, pieces_activites.IDtype_piece, individus.IDindividu
    ##    ;""" % (jonctionPresents, conditionActivites, conditionPresents)
    ##    DB.ExecuterReq(req)
    ##    listePiecesObligatoires = DB.ResultatReq()

    # Récupération des individus présents
    listePresents = []
    if presents != None:
        req = """
        SELECT IDindividu, IDinscription
        FROM consommations
        WHERE date>='%s' AND date<='%s' %s
        GROUP BY IDindividu
        ;""" % (str(presents[0]), str(presents[1]), conditionActivites)
        DB.ExecuterReq(req)
        listeIndividusPresents = DB.ResultatReq()
        for IDindividu, IDinscription in listeIndividusPresents:
            listePresents.append(IDindividu)

    req = """
    SELECT 
    inscriptions.IDfamille, pieces_activites.IDtype_piece, types_pieces.nom, types_pieces.public, types_pieces.valide_rattachement, individus.prenom, individus.IDindividu
    FROM pieces_activites 
    LEFT JOIN types_pieces ON types_pieces.IDtype_piece = pieces_activites.IDtype_piece
    LEFT JOIN inscriptions ON inscriptions.IDactivite = pieces_activites.IDactivite
    LEFT JOIN individus ON individus.IDindividu = inscriptions.IDindividu
    LEFT JOIN activites ON activites.IDactivite = inscriptions.IDactivite
    WHERE (inscriptions.date_desinscription IS NULL OR inscriptions.date_desinscription>='%s') %s AND activites.date_fin>='%s'
    GROUP BY inscriptions.IDfamille, pieces_activites.IDtype_piece, individus.IDindividu
    ;""" % (dateReference,
            conditionActivites.replace("consommations",
                                       "inscriptions"), dateReference)
    DB.ExecuterReq(req)
    listePiecesObligatoires = DB.ResultatReq()

    # Recherche des pièces déjà fournies
    req = """
    SELECT IDpiece, pieces.IDtype_piece, IDindividu, IDfamille, date_debut, date_fin, public
    FROM pieces 
    LEFT JOIN types_pieces ON types_pieces.IDtype_piece = pieces.IDtype_piece
    WHERE date_debut <= '%s' AND date_fin >= '%s'
    ORDER BY date_fin
    """ % (str(dateReference), str(dateReference))
    DB.ExecuterReq(req)
    listePiecesFournies = DB.ResultatReq()
    DB.Close()
    dictPiecesFournies = {}
    for IDpiece, IDtype_piece, IDindividu, IDfamille, date_debut, date_fin, publicPiece in listePiecesFournies:
        # Pour les pièces familiales :
        if publicPiece == "famille": IDindividu = None

        date_debut = DateEngEnDateDD(date_debut)
        date_fin = DateEngEnDateDD(date_fin)
        dictPiecesFournies[(IDfamille, IDtype_piece,
                            IDindividu)] = (date_debut, date_fin)

    # Comparaison de la liste des pièces à fournir et la liste des pièces fournies
    dictDonnees = {}
    for IDfamille, IDtype_piece, nomPiece, publicPiece, rattachementPiece, prenom, IDindividu in listePiecesObligatoires:

        if presents == None or (presents != None
                                and IDindividu in listePresents):

            # Pour les pièces familiales :
            if publicPiece == "famille": IDindividu = None
            # Pour les pièces qui sont indépendantes de la famille
            if rattachementPiece == 1:
                IDfamilleTemp = None
            else:
                IDfamilleTemp = IDfamille

            # Préparation du label
            if publicPiece == "famille" or IDindividu == None:
                label = nomPiece
            else:
                label = _(u"%s de %s") % (nomPiece, prenom)

            if dictPiecesFournies.has_key(
                (IDfamilleTemp, IDtype_piece, IDindividu)):
                date_debut, date_fin = dictPiecesFournies[(IDfamilleTemp,
                                                           IDtype_piece,
                                                           IDindividu)]
                nbreJoursRestants = (date_fin - datetime.date.today()).days
                if nbreJoursRestants > 15:
                    valide = "ok"
                else:
                    valide = "attention"
            else:
                valide = "pasok"

            dictDonnees[(IDfamille, IDtype_piece,
                         IDindividu)] = (IDfamille, IDtype_piece, nomPiece,
                                         publicPiece, prenom, IDindividu,
                                         valide, label)

    # Répartition par famille
    dictPieces = {}
    nbreFamilles = 0
    for key, valeurs in dictDonnees.iteritems():
        IDfamille = valeurs[0]
        if dictPieces.has_key(IDfamille) == False:
            dictPieces[IDfamille] = []
            if IDfamille != None:
                nbreFamilles += 1
        dictPieces[IDfamille].append(valeurs)
        dictPieces[IDfamille].sort()

    # Formatage des données
    dictFinal = {}
    titulaires = UTILS_Titulaires.GetTitulaires()
    for IDfamille, dictTemp in dictPieces.iteritems():

        if IDfamille != None and titulaires.has_key(IDfamille):
            nomTitulaires = titulaires[IDfamille]["titulairesSansCivilite"]
        else:
            nomTitulaires = _(u"Aucun titulaire")
        listePieces = []
        listeDetailPieces = []
        for piece in dictTemp:
            if piece[6] != "ok":
                listePieces.append(piece[7])
                listeDetailPieces.append(piece)
        textePieces = ", ".join(listePieces)

        if concernes == False or (concernes == True and len(listePieces) > 0):
            dictFinal[IDfamille] = {
                "titulaires": nomTitulaires,
                "pieces": textePieces,
                "nbre": len(listePieces),
                "liste": listeDetailPieces
            }

    return dictFinal
コード例 #3
0
ファイル: UTILS_Export_nomade.py プロジェクト: CugeDe/Noethys
    def Run(self, afficherDlgAttente=False):
        dictParametres = self.GetParametres()

        # Ouverture dlg d'attente
        if afficherDlgAttente == True:
            dlgAttente = wx.BusyInfo(
                _(u"Génération du fichier de données..."), None)

        try:

            # Génération du nom de fichier
            self.nomFichier = UTILS_Fichiers.GetRepTemp(
                fichier=u"data_%s" % dictParametres["IDfichier"])

            # Vérifie si le fichier existe déj�
            nomFichierTemp = self.nomFichier + ".dat"
            if os.path.isfile(nomFichierTemp):
                os.remove(nomFichierTemp)

            # Création des tables
            dbdest = GestionDB.DB(suffixe=None,
                                  nomFichier=nomFichierTemp,
                                  modeCreation=True)
            dbdest.CreationTables(dicoDB=self.dictTables)

            # Enregistrement des paramètres
            listeParametres = [
                ("IDfichier", dictParametres["IDfichier"]),
                ("horodatage", dictParametres["horodatage"]),
                ("type", "donnees"),
            ]
            self.Enregistrer(dbdest,
                             nomTable="parametres",
                             listeChamps=["nom", "valeur"],
                             listeDonnees=listeParametres)

            # Données du dictIndividus
            import UTILS_Infos_individus
            infos = UTILS_Infos_individus.Informations()
            dictValeurs = infos.GetDictValeurs(mode="individu",
                                               formatChamp=False)
            listeDonnees = []
            for ID, dictTemp in dictValeurs.iteritems():
                for champ, valeur in dictTemp.iteritems():
                    if type(valeur) in (str, unicode) and valeur not in ("",
                                                                         None):
                        listeDonnees.append((ID, champ, valeur))

            self.Enregistrer(dbdest,
                             nomTable="informations",
                             listeChamps=["IDindividu", "champ", "valeur"],
                             listeDonnees=listeDonnees)

            # Données individus
            db = GestionDB.DB(suffixe="PHOTOS")
            req = """SELECT IDindividu, photo FROM photos;"""
            db.ExecuterReq(req)
            listePhotos = db.ResultatReq()
            db.Close()
            dictPhotos = {}
            for IDindividu, photo in listePhotos:
                dictPhotos[IDindividu] = photo

            db = GestionDB.DB()
            req = """SELECT IDindividu, IDcivilite, nom, prenom FROM individus;"""
            db.ExecuterReq(req)
            listeIndividus = db.ResultatReq()
            db.Close()
            listeDonnees = []
            for IDindividu, IDcivilite, nom, prenom in listeIndividus:
                if dictPhotos.has_key(IDindividu):
                    photo = sqlite3.Binary(dictPhotos[IDindividu])
                else:
                    photo = None
                listeDonnees.append(
                    (IDindividu, IDcivilite, nom, prenom, photo))

            self.Enregistrer(dbdest,
                             nomTable="individus",
                             listeChamps=[
                                 "IDindividu", "IDcivilite", "nom", "prenom",
                                 "photo"
                             ],
                             listeDonnees=listeDonnees)

            # Données Titulaires de dossier
            dictTitulaires = UTILS_Titulaires.GetTitulaires()
            listeDonnees = []
            for IDfamille, dictTemp in dictTitulaires.iteritems():
                nom = dictTitulaires[IDfamille]["titulairesSansCivilite"]
                listeDonnees.append((IDfamille, nom))

            self.Enregistrer(dbdest,
                             nomTable="titulaires",
                             listeChamps=["IDfamille", "nom"],
                             listeDonnees=listeDonnees)

            # Données organisateur
            db = GestionDB.DB()
            req = """SELECT IDorganisateur, nom, logo FROM organisateur;"""
            db.ExecuterReq(req)
            listeTemp = db.ResultatReq()
            db.Close()
            listeDonnees = []
            for IDorganisateur, nom, logo in listeTemp:
                if logo != None:
                    logo = sqlite3.Binary(logo)
                listeDonnees.append((IDorganisateur, nom, logo))

            self.Enregistrer(dbdest,
                             nomTable="organisateur",
                             listeChamps=["IDorganisateur", "nom", "logo"],
                             listeDonnees=listeDonnees)

            # Tables à copier en intégralité
            listeTables = [
                "vacances",
                "jours_feries",
                "activites",
                "groupes",
                "unites",
                "unites_groupes",
                "unites_incompat",
                "unites_remplissage",
                "unites_remplissage_unites",
                "ouvertures",
                "remplissage",
                "inscriptions",
                "consommations",
                "memo_journee",
                "comptes_payeurs",
                "familles",
                "utilisateurs",
                "nomade_archivage",
            ]
            self.CopieTables(dbdest, listeTables)

            # Cloture de la base
            dbdest.connexion.commit()
            dbdest.Close()

            # Compression
            fichierZip = zipfile.ZipFile(self.nomFichier + EXTENSION_DECRYPTE,
                                         "w",
                                         compression=zipfile.ZIP_DEFLATED)
            fichierZip.write(self.nomFichier + ".dat", "database.dat")
            fichierZip.close()
            os.remove(self.nomFichier + ".dat")

            # Cryptage
            cryptage_actif = UTILS_Config.GetParametre(
                "synchro_cryptage_activer", defaut=False)
            cryptage_mdp = base64.b64decode(
                UTILS_Config.GetParametre("synchro_cryptage_mdp", defaut=""))
            if cryptage_actif == True and cryptage_mdp != "":
                UTILS_Cryptage_fichier.CrypterFichier(
                    self.nomFichier + EXTENSION_DECRYPTE,
                    self.nomFichier + EXTENSION_CRYPTE, cryptage_mdp)
                os.remove(self.nomFichier + EXTENSION_DECRYPTE)
                nomFichierFinal = self.nomFichier + EXTENSION_CRYPTE
            else:
                nomFichierFinal = self.nomFichier + EXTENSION_DECRYPTE

        except Exception, err:
            if afficherDlgAttente == True:
                dlgAttente.Destroy()
                del dlgAttente
            dlg = wx.MessageDialog(
                None,
                _(u"Désolé, l'erreur suivante a été rencontrée : ") +
                str(err), "Erreur ", wx.OK | wx.ICON_ERROR)
            dlg.ShowModal()
            dlg.Destroy()
            return None
コード例 #4
0
def GetAdresseFamille(IDfamille=None,
                      choixMultiple=True,
                      muet=False,
                      nomTitulaires=None):
    """ Récupère l'adresse email de la famille """
    # Récupération du nom de la famille
    if nomTitulaires == None:
        dictTitulaires = UTILS_Titulaires.GetTitulaires([
            IDfamille,
        ])
        nomTitulaires = dictTitulaires[IDfamille]["titulairesSansCivilite"]
    # Récupération des adresses mails de chaque membre de la famille
    DB = GestionDB.DB()
    req = """
    SELECT 
    rattachements.IDindividu, IDcategorie,
    individus.nom, individus.prenom, individus.mail, individus.travail_mail
    FROM rattachements 
    LEFT JOIN individus ON individus.IDindividu = rattachements.IDindividu
    WHERE IDcategorie IN (1, 2) AND IDfamille=%d
    ;""" % IDfamille
    DB.ExecuterReq(req)
    listeDonnees = DB.ResultatReq()
    DB.Close()
    listeAdresses = []
    for IDindividu, IDcategorie, nom, prenom, mailPerso, mailTravail in listeDonnees:
        if mailPerso != None and mailPerso != "":
            listeAdresses.append(
                (_(u"%s (Adresse perso de %s)") % (mailPerso, prenom),
                 mailPerso))
        if mailTravail != None and mailTravail != "":
            listeAdresses.append(
                (_(u"%s (Adresse pro de %s)") % (mailTravail, prenom),
                 mailTravail))
    if len(listeAdresses) == 0:
        if muet == False:
            dlg = wx.MessageDialog(
                None,
                _(u"Aucun membre de la famille de %s ne dispose d'adresse mail !"
                  ) % nomTitulaires, "Erreur", wx.OK | wx.ICON_EXCLAMATION)
            dlg.ShowModal()
            dlg.Destroy()
        return []
    elif len(listeAdresses) == 1:
        listeMails = [
            listeAdresses[0][1],
        ]
    else:
        listeLabels = []
        listeMails = []
        for label, adresse in listeAdresses:
            listeLabels.append(label)
        if choixMultiple == True:
            dlg = wx.MultiChoiceDialog(
                None,
                _(u"%d adresses internet sont disponibles pour la famille de %s.\nSélectionnez celles que vous souhaitez utiliser puis cliquez sur le bouton 'Ok' :"
                  ) % (len(listeAdresses), nomTitulaires),
                _(u"Choix d'adresses Emails"), listeLabels)
        else:
            dlg = wx.SingleChoiceDialog(
                None,
                _(u"%d adresses internet sont disponibles pour la famille de %s.\nSélectionnez celle que vous souhaitez utiliser puis cliquez sur le bouton 'Ok' :"
                  ) % (len(listeAdresses), nomTitulaires),
                _(u"Choix d'une adresse Email"), listeLabels)
        dlg.SetSize((450, -1))
        dlg.CenterOnScreen()
        if dlg.ShowModal() == wx.ID_OK:
            if choixMultiple == True:
                selections = dlg.GetSelections()
            else:
                selections = [
                    dlg.GetSelection(),
                ]
            dlg.Destroy()
            if len(selections) == 0:
                dlg = wx.MessageDialog(
                    None,
                    _(u"Vous n'avez sélectionné aucune adresse mail !"),
                    "Erreur", wx.OK | wx.ICON_EXCLAMATION)
                dlg.ShowModal()
                dlg.Destroy()
                return []
            for index in selections:
                listeMails.append(listeAdresses[index][1])
        else:
            dlg.Destroy()
            return []

    if choixMultiple == True:
        return listeMails
    else:
        return listeMails[0]
コード例 #5
0
        # Création des tables
        models.Base.metadata.drop_all(engine)
        models.Base.metadata.create_all(engine)

        # Création d'une session
        Session = models.sessionmaker(bind=engine)
        session = Session()

        # Ouverture de la base Noethys
        DB = GestionDB.DB()

        self.log.EcritLog(_(u"Récupération des données à exporter..."))
        self.Pulse_gauge()

        # Création des users
        dictTitulaires = UTILS_Titulaires.GetTitulaires()

        req = """SELECT IDfamille, internet_actif, internet_identifiant, internet_mdp
        FROM familles;"""
        DB.ExecuterReq(req)
        listeDonnees = DB.ResultatReq()

        for IDfamille, internet_actif, internet_identifiant, internet_mdp in listeDonnees:
            if internet_actif == 1:
                nomsTitulaires = dictTitulaires[IDfamille][
                    "titulairesSansCivilite"]
                # Cryptage du mot de passe
                internet_mdp = SHA256.new(internet_mdp).hexdigest()

                m = models.User(IDuser=None,
                                identifiant=internet_identifiant,
コード例 #6
0
def GetListeCotisationsManquantes(dateReference=None, listeActivites=None, presents=None, concernes=False):
    if dateReference == None : 
        dateReference = datetime.date.today()

    # Récupération des données
    dictItems = {}

    # Conditions Activites
    if listeActivites == None or listeActivites == [] :
        conditionActivites = ""
    else:
        if len(listeActivites) == 1 :
            conditionActivites = " AND inscriptions.IDactivite=%d" % listeActivites[0]
        else:
            conditionActivites = " AND inscriptions.IDactivite IN %s" % str(tuple(listeActivites))

    # Conditions Présents
    if presents == None :
        conditionPresents = ""
        jonctionPresents = ""
    else:
        conditionPresents = " AND (consommations.date>='%s' AND consommations.date<='%s')" % (str(presents[0]), str(presents[1]))
        jonctionPresents = "LEFT JOIN consommations ON consommations.IDindividu = individus.IDindividu"
    
    # Récupération des cotisations à fournir pour la famille ou l'individu
    DB = GestionDB.DB()
    req = """
    SELECT 
    inscriptions.IDfamille, cotisations_activites.IDactivite, cotisations_activites.IDtype_cotisation, types_cotisations.nom, types_cotisations.type, individus.prenom, individus.IDindividu
    FROM cotisations_activites 
    LEFT JOIN types_cotisations ON types_cotisations.IDtype_cotisation = cotisations_activites.IDtype_cotisation
    LEFT JOIN inscriptions ON inscriptions.IDactivite = cotisations_activites.IDactivite
    LEFT JOIN individus ON individus.IDindividu = inscriptions.IDindividu
    %s
    WHERE inscriptions.parti=0 %s %s
    GROUP BY inscriptions.IDfamille, cotisations_activites.IDtype_cotisation, individus.IDindividu;
    """ % (jonctionPresents, conditionActivites, conditionPresents)
    DB.ExecuterReq(req)
    listeCotisationsObligatoires = DB.ResultatReq()
    
    dictCotisationObligatoires = {}
    for IDfamille, IDactivite, IDtype_cotisation, nomCotisation, typeCotisation, prenom, IDindividu in listeCotisationsObligatoires :
        if dictCotisationObligatoires.has_key(IDfamille) == False :
            dictCotisationObligatoires[IDfamille] = {}
        if dictCotisationObligatoires[IDfamille].has_key(IDactivite) == False :
            dictCotisationObligatoires[IDfamille][IDactivite] = []
        dictCotisationObligatoires[IDfamille][IDactivite].append((IDfamille, IDtype_cotisation, nomCotisation, typeCotisation, prenom, IDindividu))
    
    # Recherche des cotisations déjà fournies
    req = """
    SELECT IDcotisation, cotisations.IDtype_cotisation, IDindividu, IDfamille, date_debut, date_fin, type
    FROM cotisations 
    LEFT JOIN types_cotisations ON types_cotisations.IDtype_cotisation = cotisations.IDtype_cotisation
    WHERE date_debut <= '%s' AND date_fin >= '%s'
    ORDER BY date_fin
    """ % (str(dateReference), str(dateReference))
    DB.ExecuterReq(req)
    listeCotisationsFournies = DB.ResultatReq()
    DB.Close()
    dictCotisationsFournies = {}
    for IDcotisation, IDtype_cotisation, IDindividu, IDfamille, date_debut, date_fin, typeCotisation in listeCotisationsFournies :
        # Pour les cotisations familiales :
        if typeCotisation == "famille" : IDindividu = None
        
        date_debut = DateEngEnDateDD(date_debut)
        date_fin = DateEngEnDateDD(date_fin)
        dictCotisationsFournies[ (IDfamille, IDtype_cotisation, IDindividu) ] = (date_debut, date_fin)
    
    # Comparaison de la liste des cotisations à fournir et la liste des cotisations fournies
    dictDonnees = {}
    for IDfamille, dictCotisationsFamille in dictCotisationObligatoires.iteritems() :
        for IDactivite, listeCotisationsActivite in dictCotisationsFamille.iteritems() :
            activiteValide = False
            
            listeTemp = []
            for IDfamille, IDtype_cotisation, nomCotisation, typeCotisation, prenom, IDindividu in listeCotisationsActivite :
                
##                # Pour les cotisations familiales :
##                if typeCotisation == "famille" : 
##                    IDindividu = None
##                else:
##                    # Pour les cotisations qui sont indépendantes de la famille
##                    IDfamilleTemp = None
                
                # Préparation du label
                if typeCotisation == "famille" or IDindividu == None :
                    label = nomCotisation
                else:
                    label = _(u"%s de %s") % (nomCotisation, prenom)
                
                if dictCotisationsFournies.has_key((None, IDtype_cotisation, IDindividu)) or dictCotisationsFournies.has_key((IDfamille, IDtype_cotisation, None)) :
                    if dictCotisationsFournies.has_key((None, IDtype_cotisation, IDindividu)) :
                        date_debut, date_fin = dictCotisationsFournies[(None, IDtype_cotisation, IDindividu)]
                    if dictCotisationsFournies.has_key((IDfamille, IDtype_cotisation, None)) :
                        date_debut, date_fin = dictCotisationsFournies[(IDfamille, IDtype_cotisation, None)]
                    nbreJoursRestants = (date_fin - datetime.date.today()).days
                    if nbreJoursRestants > 15 :
                        valide = "ok"
                    else:
                        valide = "attention"
                else:
                    valide = "pasok"
                
                if valide == "ok" :
                    activiteValide = True
                    
                listeTemp.append((IDfamille, IDtype_cotisation, nomCotisation, typeCotisation, prenom, IDindividu, valide, label))
                
            # Mémorisation
            for IDfamille, IDtype_cotisation, nomCotisation, typeCotisation, prenom, IDindividu, valide, label in listeTemp :
                if activiteValide == True :
                    valide = "ok"
                dictDonnees[(IDfamille, IDtype_cotisation, IDindividu)] = (IDfamille, IDtype_cotisation, nomCotisation, typeCotisation, prenom, IDindividu, valide, label)
                
##                if IDfamille == 57 or IDindividu == 107 :
##                    print (IDfamille, IDtype_cotisation, nomCotisation, typeCotisation, prenom, IDindividu, valide, label)
                    
    # Comparaison de la liste des cotisations à fournir et la liste des cotisations fournies
##    dictDonnees = {}
##    for IDfamille, IDactivite, IDtype_cotisation, nomCotisation, typeCotisation, prenom, IDindividu, nbreConso in listeCotisationsObligatoires :
##        
##        # Pour les cotisations familiales :
##        if typeCotisation == "famille" : 
##            IDindividu = None
##        else:
##            # Pour les cotisations qui sont indépendantes de la famille
##            IDfamille = None
##        
##        # Préparation du label
##        if typeCotisation == "famille" or IDindividu == None :
##            label = nomCotisation
##        else:
##            label = _(u"%s de %s") % (nomCotisation, prenom)
##
##        if dictCotisationsFournies.has_key( (IDfamille, IDtype_cotisation, IDindividu) ) :
##            date_debut, date_fin = dictCotisationsFournies[(IDfamille, IDtype_cotisation, IDindividu)]
##            nbreJoursRestants = (date_fin - datetime.date.today()).days
##            if nbreJoursRestants > 15 :
##                valide = "ok"
##            else:
##                valide = "attention"
##        else:
##            valide = "pasok"
##            
##        dictDonnees[(IDfamille, IDtype_cotisation, IDindividu)] = (IDfamille, IDtype_cotisation, nomCotisation, typeCotisation, prenom, IDindividu, valide, label)
    
    # Répartition par famille
    dictCotisations = {}
    nbreFamilles = 0
    nbreCotisations = len(dictDonnees)
    for key, valeurs in dictDonnees.iteritems() :
        IDfamille = valeurs[0]
        if dictCotisations.has_key(IDfamille) == False :
            dictCotisations[IDfamille] = []
            if IDfamille != None : 
                nbreFamilles += 1
        dictCotisations[IDfamille].append(valeurs)
        dictCotisations[IDfamille].sort()
    
    # Formatage des données
    dictFinal = {}
    titulaires = UTILS_Titulaires.GetTitulaires() 
    for IDfamille, dictTemp in dictCotisations.iteritems() :
##        print IDfamille
##        for cotisation in dictTemp :
##            print "  >", cotisation
        if IDfamille != None and titulaires.has_key(IDfamille) :
            nomTitulaires = titulaires[IDfamille]["titulairesSansCivilite"]
        else :
            nomTitulaires = _(u"Aucun titulaire")
        listeCotisations = []
        listeDetailCotisations = []
        for cotisation in dictTemp :
            labelCotisation = cotisation[7]
            if cotisation[6] != "ok" and labelCotisation not in listeCotisations :
                listeCotisations.append(labelCotisation)
        listeDetailCotisations.append(cotisation)
        texteCotisations = ", ".join(listeCotisations)
        
        if concernes == False or (concernes == True and len(listeCotisations) > 0) :
            dictFinal[IDfamille] = {"titulaires" : nomTitulaires, "cotisations" : texteCotisations, "nbre" : len(listeCotisations), "liste" : listeDetailCotisations}
    
    return dictFinal