Пример #1
0
class Panel(wx.Panel):
    def __init__(self,
                 parent,
                 selectionLignes=[],
                 selectionPersonnes=[],
                 selectionDates=(None, None)):
        wx.Panel.__init__(self,
                          parent,
                          -1,
                          name="panel_applicModele",
                          style=wx.TAB_TRAVERSAL)
        self.parent = parent

        self.selectionLignes = selectionLignes
        self.selectionPersonnes = selectionPersonnes
        self.selectionDates = selectionDates

        self.panel_base_1 = wx.Panel(self, -1)
        self.panel_base_2 = wx.Panel(self.panel_base_1, -1)
        self.sizer_modeles_staticbox = wx.StaticBox(
            self.panel_base_2, -1, _(u"Sélection des modèles"))
        self.sizer_parametres_staticbox = wx.StaticBox(
            self.panel_base_2, -1,
            _(u"Sélection de la période et des personnes"))
        self.radio_btn_1 = wx.RadioButton(self.panel_base_2, -1, u"")
        self.radio_btn_2 = wx.RadioButton(
            self.panel_base_2, -1, _(u"Selon les paramètres suivants :"))
        self.label_periode = wx.StaticText(self.panel_base_2, -1,
                                           _(u"Période du :"))
        self.date_debut = DatePickerCtrl(self.panel_base_2,
                                         -1,
                                         style=DP_DROPDOWN)
        self.label_au = wx.StaticText(self.panel_base_2, -1, "au")
        self.date_fin = DatePickerCtrl(self.panel_base_2,
                                       -1,
                                       style=DP_DROPDOWN)
        self.label_personnes = wx.StaticText(self.panel_base_2, -1,
                                             "Personnes :")
        self.list_ctrl_personnes = listCtrl_Personnes(self.panel_base_2)
        self.list_ctrl_personnes.SetMinSize((20, 80))
        self.list_ctrl_modeles = listCtrl_Modeles(self.panel_base_2)
        self.list_ctrl_modeles.SetMinSize((20, 20))
        self.bouton_ajouter = wx.BitmapButton(
            self.panel_base_2, -1,
            wx.Bitmap(Chemins.GetStaticPath("Images/16x16/Ajouter.png"),
                      wx.BITMAP_TYPE_ANY))
        self.bouton_modifier = wx.BitmapButton(
            self.panel_base_2, -1,
            wx.Bitmap(Chemins.GetStaticPath("Images/16x16/Modifier.png"),
                      wx.BITMAP_TYPE_ANY))
        self.bouton_dupliquer = wx.BitmapButton(
            self.panel_base_2, -1,
            wx.Bitmap(Chemins.GetStaticPath("Images/16x16/Dupliquer.png"),
                      wx.BITMAP_TYPE_ANY))
        self.bouton_supprimer = wx.BitmapButton(
            self.panel_base_2, -1,
            wx.Bitmap(Chemins.GetStaticPath("Images/16x16/Supprimer.png"),
                      wx.BITMAP_TYPE_ANY))
        self.bouton_aide = wx.BitmapButton(
            self.panel_base_2, -1,
            wx.Bitmap(
                Chemins.GetStaticPath("Images/BoutonsImages/Aide_L72.png"),
                wx.BITMAP_TYPE_ANY))
        self.bouton_ok = wx.BitmapButton(
            self.panel_base_2, -1,
            wx.Bitmap(Chemins.GetStaticPath("Images/BoutonsImages/Ok_L72.png"),
                      wx.BITMAP_TYPE_ANY))
        self.bouton_annuler = wx.BitmapButton(
            self.panel_base_2, -1,
            wx.Bitmap(
                Chemins.GetStaticPath("Images/BoutonsImages/Annuler_L72.png"),
                wx.BITMAP_TYPE_ANY))

        self.__set_properties()
        self.__do_layout()

        self.Bind(wx.EVT_RADIOBUTTON, self.OnRadio1, self.radio_btn_1)
        self.Bind(wx.EVT_RADIOBUTTON, self.OnRadio2, self.radio_btn_2)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonAide, self.bouton_aide)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonOk, self.bouton_ok)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonAnnuler, self.bouton_annuler)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonAjouter, self.bouton_ajouter)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonModifier, self.bouton_modifier)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonSupprimer, self.bouton_supprimer)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonDupliquer, self.bouton_dupliquer)
        self.Bind(wx.EVT_CLOSE, self.OnClose)

        self.boutonsEnabled(True, False, False)
        self.SetLabelRadio1()

        # Définit les dates des datePickers
        if self.selectionDates[0] != None:
            jour = self.selectionDates[0].day
            mois = self.selectionDates[0].month - 1
            annee = self.selectionDates[0].year
            date = wx.DateTime()
            date.Set(jour, mois, annee)
            self.date_debut.SetValue(date)

        if self.selectionDates[1] != None:
            jour = self.selectionDates[1].day
            mois = self.selectionDates[1].month - 1
            annee = self.selectionDates[1].year
            date = wx.DateTime()
            date.Set(jour, mois, annee)
            self.date_fin.SetValue(date)

    def __set_properties(self):
        self.bouton_ajouter.SetToolTip(
            wx.ToolTip(_(u"Cliquez ici pour créer un modèle")))
        self.bouton_modifier.SetToolTip(
            wx.ToolTip(
                _(u"Cliquez ici pour modifier le modèle sélectionné dans la liste"
                  )))
        self.bouton_supprimer.SetToolTip(
            wx.ToolTip(
                _(u"Cliquez ici pour supprimer le modèle sélectionné dans la liste"
                  )))
        self.bouton_dupliquer.SetToolTip(
            wx.ToolTip(
                _(u"Cliquez ici pour dupliquer le modèle sélectionné dans la liste"
                  )))

    def __do_layout(self):
        sizer_base_1 = wx.BoxSizer(wx.VERTICAL)
        sizer_base_2 = wx.BoxSizer(wx.VERTICAL)
        grid_sizer_base = wx.FlexGridSizer(rows=3, cols=1, vgap=10, hgap=10)
        grid_sizer_boutons = wx.FlexGridSizer(rows=1, cols=5, vgap=10, hgap=10)
        sizer_modeles = wx.StaticBoxSizer(self.sizer_modeles_staticbox,
                                          wx.VERTICAL)
        grid_sizer_modeles = wx.FlexGridSizer(rows=1, cols=2, vgap=5, hgap=5)
        grid_sizer_boutons_modeles = wx.FlexGridSizer(rows=4,
                                                      cols=1,
                                                      vgap=5,
                                                      hgap=5)
        sizer_parametres = wx.StaticBoxSizer(self.sizer_parametres_staticbox,
                                             wx.VERTICAL)
        grid_sizer_parametres = wx.FlexGridSizer(rows=3,
                                                 cols=1,
                                                 vgap=10,
                                                 hgap=10)
        grid_sizer_manuel = wx.FlexGridSizer(rows=2, cols=2, vgap=10, hgap=10)
        grid_sizer_dates = wx.FlexGridSizer(rows=1, cols=3, vgap=10, hgap=10)
        grid_sizer_parametres.Add(self.radio_btn_1, 0, 0, 0)
        grid_sizer_parametres.Add(self.radio_btn_2, 0, 0, 0)
        grid_sizer_manuel.Add(self.label_periode, 0,
                              wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 0)
        grid_sizer_dates.Add(self.date_debut, 0, 0, 0)
        grid_sizer_dates.Add(self.label_au, 0, wx.ALIGN_CENTER_VERTICAL, 0)
        grid_sizer_dates.Add(self.date_fin, 0, 0, 0)
        grid_sizer_manuel.Add(grid_sizer_dates, 1, wx.EXPAND, 0)
        grid_sizer_manuel.Add(self.label_personnes, 0,
                              wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 0)
        grid_sizer_manuel.Add(self.list_ctrl_personnes, 1, wx.EXPAND, 0)
        grid_sizer_manuel.AddGrowableCol(1)
        grid_sizer_parametres.Add(grid_sizer_manuel, 1, wx.LEFT | wx.EXPAND,
                                  30)
        grid_sizer_parametres.AddGrowableCol(0)
        sizer_parametres.Add(grid_sizer_parametres, 1, wx.ALL | wx.EXPAND, 10)
        grid_sizer_base.Add(sizer_parametres, 1, wx.EXPAND, 0)
        grid_sizer_modeles.Add(self.list_ctrl_modeles, 1, wx.EXPAND, 0)
        grid_sizer_boutons_modeles.Add(self.bouton_ajouter, 0, 0, 0)
        grid_sizer_boutons_modeles.Add(self.bouton_modifier, 0, 0, 0)
        grid_sizer_boutons_modeles.Add(self.bouton_dupliquer, 0, 0, 0)
        grid_sizer_boutons_modeles.Add(self.bouton_supprimer, 0, 0, 0)
        grid_sizer_modeles.Add(grid_sizer_boutons_modeles, 1, wx.EXPAND, 0)
        grid_sizer_modeles.AddGrowableRow(0)
        grid_sizer_modeles.AddGrowableCol(0)
        sizer_modeles.Add(grid_sizer_modeles, 1, wx.ALL | wx.EXPAND, 10)
        grid_sizer_base.Add(sizer_modeles, 1, wx.EXPAND, 0)
        grid_sizer_boutons.Add(self.bouton_aide, 0, 0, 0)
        grid_sizer_boutons.Add((20, 20), 0, 0, 0)
        grid_sizer_boutons.Add(self.bouton_ok, 0, 0, 0)
        grid_sizer_boutons.Add(self.bouton_annuler, 0, 0, 0)
        grid_sizer_boutons.AddGrowableCol(1)
        grid_sizer_base.Add(grid_sizer_boutons, 1, wx.EXPAND, 0)
        self.panel_base_2.SetSizer(grid_sizer_base)
        grid_sizer_base.AddGrowableRow(1)
        grid_sizer_base.AddGrowableCol(0)
        sizer_base_2.Add(self.panel_base_2, 1, wx.ALL | wx.EXPAND, 10)
        self.panel_base_1.SetSizer(sizer_base_2)
        sizer_base_1.Add(self.panel_base_1, 1, wx.EXPAND, 0)
        self.SetSizer(sizer_base_1)
        sizer_base_1.Fit(self)
        self.Layout()
        self.grid_sizer_manuel = grid_sizer_manuel

    def SetLabelRadio1(self):
        """ Assigne un label au radio1 """
        if self.parent.GetName() == "panel_applicModele_FicheInd":
            if len(self.selectionLignes) == 0:
                txt = _(u"Selon les dates sélectionnées dans le calendrier")
            elif len(self.selectionLignes) == 1:
                txt = _(u"Selon la date sélectionnée dans le calendrier")
            else:
                txt = _(u"Selon les ") + str(len(self.selectionLignes)) + _(
                    u" dates sélectionnées dans le calendrier")
        else:
            if len(self.selectionLignes) == 0:
                txt = _(u"Selon les lignes sélectionnées dans le planning")
            elif len(self.selectionLignes) == 1:
                txt = _(u"Selon la ligne sélectionnée dans le planning")
            else:
                txt = _(u"Selon les ") + str(len(self.selectionLignes)) + _(
                    u" lignes sélectionnées dans le planning")
        self.radio_btn_1.SetLabel(txt)
        if len(self.selectionLignes) == 0:
            self.radio_btn_1.Enable(False)
            self.radio_btn_2.SetValue(True)
            self.date_debut.Enable(True)
            self.date_fin.Enable(True)
        else:
            self.radio_btn_1.Enable(True)
            self.radio_btn_1.SetValue(True)
            self.date_debut.Enable(False)
            self.date_fin.Enable(False)

    def OnClose(self, event):
        self.Fermer()
        event.Skip()

    def OnRadio1(self, event):
        self.ParamEnabled(False)

    def OnRadio2(self, event):
        self.ParamEnabled(True)

    def ParamEnabled(self, etat):
        self.label_periode.Enable(etat)
        self.date_debut.Enable(etat)
        self.label_au.Enable(etat)
        self.date_fin.Enable(etat)
        self.label_personnes.Enable(etat)
        self.list_ctrl_personnes.Enable(etat)

    def boutonsEnabled(self, ajouter=True, modifier=True, supprimer=True):
        self.bouton_ajouter.Enable(ajouter)
        self.bouton_modifier.Enable(modifier)
        self.bouton_supprimer.Enable(supprimer)
        self.bouton_dupliquer.Enable(supprimer)

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

    def OnBoutonAnnuler(self, event):
        self.Fermer()

    def Fermer(self):
        if self.parent.GetName() == "panel_applicModele_FicheInd":
            # Si appellée à partir de la fiche individuelle
            self.parent.GetParent().Fermer()
        else:
            # Sinon...
            self.parent.Fermer()

    def OnBoutonOk(self, event):
        """ Bouton Ok """
        # Vérifie qu'au moins un modèle a été coché
        selectionModeles = self.list_ctrl_modeles.selections
        if len(selectionModeles) == 0:
            dlg = wx.MessageDialog(
                self,
                _(u"Vous devez cocher au moins un modèle dans la liste proposée."
                  ), "Erreur", wx.OK)
            dlg.ShowModal()
            dlg.Destroy()
            return

        DB = GestionDB.DB()
        # Récupération des modèles
        if len(selectionModeles) == 1:
            selectionModelesTmp = "(%d)" % selectionModeles[0]
        else:
            selectionModelesTmp = str(tuple(selectionModeles))
        req = "SELECT * FROM modeles_planning WHERE IDmodele IN %s" % selectionModelesTmp
        DB.ExecuterReq(req)
        listeModeles = DB.ResultatReq()
        dictModeles = {}
        inclureFeries = False
        for modele in listeModeles:
            dictModeles[modele[0]] = (modele[1], modele[2], modele[3],
                                      modele[4], modele[5])
            if modele[5] == 1:
                inclureFeries = True
        # Récupération des tâches
        req = "SELECT * FROM modeles_taches WHERE IDmodele IN %s" % selectionModelesTmp
        DB.ExecuterReq(req)
        listeTaches = DB.ResultatReq()
        DB.Close()

        # On enlève les taches non utiles (d'autres périodes)
        listeExclusions = []
        for tache in listeTaches:
            typeModele = dictModeles[tache[1]][1]
            periodesModele = dictModeles[tache[1]][3]
            # Comparaison du type
            if typeModele != tache[2]:
                if tache[0] not in listeExclusions:
                    listeExclusions.append(tache[0])
            else:
                if tache[3] == 1 and periodesModele[0] != "1":
                    if tache[0] not in listeExclusions:
                        listeExclusions.append(tache[0])
                if tache[3] == 2 and periodesModele[1] != "1":
                    if tache[0] not in listeExclusions:
                        listeExclusions.append(tache[0])
                if tache[3] == 3 and periodesModele[2] != "1":
                    if tache[0] not in listeExclusions:
                        listeExclusions.append(tache[0])

        for exclusion in listeExclusions:
            index = 0
            for tache in listeTaches:
                if tache[0] == exclusion:
                    listeTaches.pop(index)
                    break
                index += 1

        # Creation du schéma d'application
        periodeEcole = {1: [], 2: [], 3: [], 4: [], 5: [], 6: [], 7: []}
        periodeVacs = {1: [], 2: [], 3: [], 4: [], 5: [], 6: [], 7: []}

        for tache in listeTaches:
            IDtache = tache[0]
            type = tache[2]
            periode = tache[3]
            jour = tache[4]
            heure_debut = tache[5]
            heure_fin = tache[6]
            IDcategorie = tache[7]
            intitule = tache[8]

            # Application periodeEcole :
            if periode == 1 or periode == 2:
                if type == "journ":
                    for numJour in range(1, 8):
                        detailTache = (IDtache, heure_debut, heure_fin,
                                       IDcategorie, intitule)
                        periodeEcole[numJour].append(detailTache)
                if type == "hebdo":
                    detailTache = (IDtache, heure_debut, heure_fin,
                                   IDcategorie, intitule)
                    periodeEcole[jour].append(detailTache)

            # Application periodeVacs :
            if periode == 1 or periode == 3:
                if type == "journ":
                    for numJour in range(1, 8):
                        detailTache = (IDtache, heure_debut, heure_fin,
                                       IDcategorie, intitule)
                        periodeVacs[numJour].append(detailTache)
                if type == "hebdo":
                    detailTache = (IDtache, heure_debut, heure_fin,
                                   IDcategorie, intitule)
                    periodeVacs[jour].append(detailTache)

        # On vérifie que des taches ne se chevauchent pas dans le schéma d'application
        chevauchement = 0

        for numJour in range(1, 8):
            for tacheRef in periodeEcole[numJour]:
                for tacheComp in periodeEcole[numJour]:
                    if tacheComp[0] != tacheRef[0]:
                        # Comparaison des horaires
                        ##                        if tacheComp[1] < tacheRef[1] < tacheComp[2] :
                        ##                            chevauchement += 1
                        ##                        if tacheComp[1] < tacheRef [2]< tacheComp[2] :
                        ##                            chevauchement += 1
                        if (tacheComp[1] < tacheRef[2]) and (tacheComp[2] >
                                                             tacheRef[1]):
                            chevauchement += 1

        for numJour in range(1, 8):
            for tacheRef in periodeVacs[numJour]:
                for tacheComp in periodeVacs[numJour]:
                    if tacheComp[0] != tacheRef[0]:
                        # Comparaison des horaires
                        ##                        if tacheComp[1] < tacheRef[1] < tacheComp[2] :
                        ##                            chevauchement += 1
                        ##                        if tacheComp[1] < tacheRef [2]< tacheComp[2] :
                        ##                            chevauchement += 1
                        if (tacheComp[1] < tacheRef[2]) and (tacheComp[2] >
                                                             tacheRef[1]):
                            chevauchement += 1

        if chevauchement > 0:
            nbreModelesCoches = len(selectionModeles)
            txt = _(u"Les ") + str(nbreModelesCoches) + _(
                u" modèles que vous avez sélectionnés ne sont pas compatibles entre eux : Des tâches se chevauchent. \n\nDéselectionnez ou modifiez les tâches de l'un des modèles."
            )
            dlg = wx.MessageDialog(self, txt, "Erreur", wx.OK)
            dlg.ShowModal()
            dlg.Destroy()
            return

        # Application du schéma d'application
        listeCreationsTaches = []

        if self.radio_btn_1.GetValue() == True:

            # Récupération des dates extremes de la sélection de lignes
            listeDatesSelection = []
            for ligne in self.selectionLignes:
                listeDatesSelection.append(ligne[1])
            listeDatesSelection.sort()
            dateMin = listeDatesSelection[0]
            dateMax = listeDatesSelection[-1]

            # Récupération des dates de jours de vacances
            listeJoursVacs = self.Importation_Jours_Vacances(dateMin, dateMax)

            # Création de la liste des taches à créer
            for ligne in self.selectionLignes:

                IDpersonne = ligne[0]
                date = ligne[1]
                jourSemaine = date.isoweekday()
                if date in listeJoursVacs: periode = "vacs"
                else: periode = "ecole"

                if periode == "vacs":
                    listTachesTemp = periodeVacs[jourSemaine]
                    for tache in listTachesTemp:
                        detailTache = (IDpersonne, date, tache[1], tache[2],
                                       tache[3], tache[4])
                        listeCreationsTaches.append(detailTache)

                if periode == "ecole":
                    listTachesTemp = periodeEcole[jourSemaine]
                    for tache in listTachesTemp:
                        detailTache = (IDpersonne, date, tache[1], tache[2],
                                       tache[3], tache[4])
                        listeCreationsTaches.append(detailTache)

        if self.radio_btn_2.GetValue() == True:

            # Vérifie que au moins 1 nom de personnes a été coché dans le listCtrl
            if len(self.selectionPersonnes) == 0:
                dlg = wx.MessageDialog(
                    self,
                    _(u"Vous devez cocher au moins un nom dans la liste des personnes."
                      ), "Erreur", wx.OK)
                dlg.ShowModal()
                dlg.Destroy()
                return

            # Vérifie que les dates données dans les datePickers sont correctes
            date_tmp = self.date_debut.GetValue()
            date_debut = datetime.date(date_tmp.GetYear(),
                                       date_tmp.GetMonth() + 1,
                                       date_tmp.GetDay())
            date_tmp = self.date_fin.GetValue()
            date_fin = datetime.date(date_tmp.GetYear(),
                                     date_tmp.GetMonth() + 1,
                                     date_tmp.GetDay())

            if date_debut > date_fin:
                dlg = wx.MessageDialog(
                    self,
                    _(u"La date de début doit être inférieure à la date de fin."
                      ), "Erreur de saisie", wx.OK)
                dlg.ShowModal()
                dlg.Destroy()
                return

            # Création de la liste de dates
            listeDatesSelection = []
            nbreJours = (date_fin - date_debut).days + 1
            dateTemp = date_debut
            for date in range(nbreJours):
                listeDatesSelection.append(dateTemp)
                dateTemp = dateTemp + datetime.timedelta(days=1)
            listeDatesSelection.sort()
            dateMin = listeDatesSelection[0]
            dateMax = listeDatesSelection[-1]

            # Récupération des dates de jours de vacances
            listeJoursVacs = self.Importation_Jours_Vacances(dateMin, dateMax)

            # Création de la liste des taches à créer
            for IDpersonne in self.selectionPersonnes:
                for date in listeDatesSelection:
                    jourSemaine = date.isoweekday()
                    if date in listeJoursVacs: periode = "vacs"
                    else: periode = "ecole"

                    if periode == "vacs":
                        listTachesTemp = periodeVacs[jourSemaine]
                        for tache in listTachesTemp:
                            detailTache = [
                                IDpersonne, date, tache[1], tache[2], tache[3],
                                tache[4]
                            ]
                            listeCreationsTaches.append(detailTache)

                    if periode == "ecole":
                        listTachesTemp = periodeEcole[jourSemaine]
                        for tache in listTachesTemp:
                            detailTache = [
                                IDpersonne, date, tache[1], tache[2], tache[3],
                                tache[4]
                            ]
                            listeCreationsTaches.append(detailTache)

        if len(listeCreationsTaches) == 0:
            dlg = wx.MessageDialog(
                self,
                _(u"Selon les paramètres que vous avez saisis, aucune tâche n'est à créer..."
                  ), "Information", wx.OK)
            dlg.ShowModal()
            dlg.Destroy()
            return

        # Création de la liste formatée de confirmation
        dictCategories = self.Importation_categories_presences()

        ##        listeConfirmations = []
        ##        for tache in listeCreationsTaches :
        ##            nomPersonne = self.list_ctrl_personnes.dictPersonnes[tache[0]][0] + " " + self.list_ctrl_personnes.dictPersonnes[tache[0]][1]
        ##            date = DatetimeDateEnStr(tache[1])
        ##            horaires = tache[2][:2] + "h" + tache[2][3:] + "-" + tache[3][:2] + "h" + tache[3][3:]
        ##            categorie = dictCategories[tache[4]]
        ##            intitule = tache[5]
        ##            detailTache = (nomPersonne, date, horaires, categorie, intitule)
        ##            listeConfirmations.append(detailTache)

        dictConfirmations = {}
        for IDpersonne in self.selectionPersonnes:
            nomPersonne = self.list_ctrl_personnes.dictPersonnes[IDpersonne][
                0] + " " + self.list_ctrl_personnes.dictPersonnes[IDpersonne][1]
            dictConfirmations[(IDpersonne, nomPersonne)] = {}

        list(dictConfirmations.keys()).sort(reverse=True)

        for tache in listeCreationsTaches:
            IDpersonne = tache[0]
            nomPersonne = self.list_ctrl_personnes.dictPersonnes[IDpersonne][
                0] + " " + self.list_ctrl_personnes.dictPersonnes[IDpersonne][1]
            key = (IDpersonne, nomPersonne)
            date = tache[1]
            horaires = (
                tache[2], tache[3]
            )  #(tache[2][:2] + "h" + tache[2][3:] + "-" + tache[3][:2] + "h" + tache[3][3:]
            categorie = dictCategories[tache[4]]
            intitule = tache[5]
            #if len(dictConfirmations[nomPersonne]) == 0 :
            if date in dictConfirmations[key]:
                dictConfirmations[key][date].append(
                    [horaires, categorie, intitule])
                dictConfirmations[key][date].sort()
            else:
                dictConfirmations[key][date] = [
                    [horaires, categorie, intitule],
                ]

        nbreTaches = len(listeCreationsTaches)

        # Fenêtre de demande de confirmation
        dlg = DLG_Confirm_appli_modele.Dialog(
            self,
            nbreTaches=nbreTaches,
            dictTaches=dictConfirmations,
            listeCreationsTaches=listeCreationsTaches,
            inclureFeries=inclureFeries)
        dlg.ShowModal()
        etat = dlg.etat
        dlg.Destroy()
        if etat == "termine":
            if self.parent.GetName() == "panel_applicModele_FicheInd":
                self.GetGrandParent().EndModal(wx.ID_OK)
            else:
                self.GetParent().EndModal(wx.ID_OK)

    def EnregistrementTaches(self, listeCreationsTaches):
        """ Enregistrement des taches dans la base de données """
        listeExceptions = []

        # Récupération des dates de jours fériés
        self.listeFeriesFixes, self.listeFeriesVariables = self.Importation_Feries(
        )

        # Initialisation de la connexion avec la Base de données
        DB = GestionDB.DB()
        for tache in listeCreationsTaches:

            IDpersonne = tache[0]
            date = tache[1]
            heure_debut = tache[2]
            heure_fin = tache[3]
            IDcategorie = tache[4]
            intitule = tache[5]

            valide = True

            # Vérifie qu'aucune tâche n'existe déjà à ce moment dans la base de données
            req = """
            SELECT IDpresence, date, heure_debut, heure_fin
            FROM presences
            WHERE (date='%s' AND IDpersonne=%d)  AND
            (heure_debut<'%s' And heure_fin>'%s');
            """ % (str(date), IDpersonne, heure_fin, heure_debut)
            DB.ExecuterReq(req)
            listePresences = DB.ResultatReq()
            nbreResultats = len(listePresences)

            # Un ou des présences existent à ce moment, donc pas d'enregistrement
            if nbreResultats != 0:
                valide = False

            # Vérifie que ce n'est pas un jour férié
            #print date, type(date)
            if (date.day, date.month) in self.listeFeriesFixes:
                valide = False
            else:
                if date in self.listeFeriesVariables:
                    valide = False

            # Enregistrement si la date est bien valide
            if valide == True:
                listeDonnees = [
                    ("IDpersonne", IDpersonne),
                    ("date", str(date)),
                    ("heure_debut", heure_debut),
                    ("heure_fin", heure_fin),
                    ("IDcategorie", IDcategorie),
                    ("intitule", intitule),
                ]
                # Enregistrement dans la base
                ID = DB.ReqInsert("presences", listeDonnees)
                DB.Commit()
            else:

                # Si date non valide : on crée un rapport
                dictPersonnes = self.list_ctrl_personnes.dictPersonnes
                nomPersonne = dictPersonnes[IDpersonne][
                    0] + " " + dictPersonnes[IDpersonne][1]
                listeExceptions.append((nomPersonne, DatetimeDateEnStr(date),
                                        (heure_debut, heure_fin)))

        # Fermeture de la base de données
        DB.Close()

        # Lecture de la liste des exceptions
        nbreInvalides = len(listeExceptions)
        nbreValides = len(listeCreationsTaches) - nbreInvalides

        if nbreInvalides != 0:
            message = ""
            if nbreValides == 0:
                message += _(
                    u"Aucune tâche n'a été correctement enregistrée.\n\nL")
            elif nbreValides == 1:
                message += str(nbreValides) + _(
                    u" tâche a été correctement enregistrée.\n\nMais l")
            else:
                message += str(nbreValides) + _(
                    u" tâches ont été correctement enregistrées.\n\nMais l"
                )
            if nbreInvalides == 1:
                message += _(
                    u"a tâche de la liste suivante n'a pas pu être saisie car elle chevauchait une ou plusieurs des tâches existantes. "
                )
                message += _(
                    u"Vous devrez donc d'abord supprimer ou modifier les horaires de ces tâches existantes avant de pouvoir saisir celle-ci.\n\n"
                )
            else:
                message += _(u"es ") + str(nbreInvalides) + _(
                    u" tâches de la liste suivante n'ont pas pu être saisies car elles chevauchaient des tâches existantes. "
                )
                message += _(
                    u"Vous devrez donc d'abord supprimer ou modifier les horaires de ces tâches existantes avant de pouvoir saisir celles-ci.\n\n"
                )
            for exception in listeExceptions:
                message += "   > Le " + exception[1] + " pour " + exception[
                    0] + " de " + exception[2][0] + u" à " + exception[2][
                        1] + ".\n"
            dlg = wx.lib.dialogs.ScrolledMessageDialog(self, message,
                                                       _(u"Rapport d'erreurs"))
            dlg.ShowModal()

        #print "fin de la procedure d'enregistrement !!!"

    def Importation_Jours_Vacances(self, dateMin=None, dateMax=None):
        """ Importation des dates d'ouverture de la structure """

        ##        # Anciennce version :
        ##        conditions = ""
        ##        if dateMin != None and dateMax != None :
        ##            conditions = " WHERE date_ouverture >= '" + str(dateMin) + "' AND date_ouverture <= '" + str(dateMax)  + "'"
        ##        DB = GestionDB.DB()
        ##        req = "SELECT * FROM dates_ouverture" + conditions + ";"
        ##        DB.ExecuterReq(req)
        ##        listeVacs1 = DB.ResultatReq()
        ##        DB.Close()
        ##
        ##        # Formatage des dates pour la liste
        ##        listeVacs2 = []
        ##        for date in listeVacs1:
        ##            dateTemp = datetime.date(int(date[1][:4]), int(date[1][5:7]), int(date[1][8:10]))
        ##            listeVacs2.append(dateTemp)
        ##        listeVacs2.sort()
        ##        return listeVacs2

        req = "SELECT * FROM periodes_vacances ORDER BY date_debut;"
        DB = GestionDB.DB()
        DB.ExecuterReq(req)
        listeVacances1 = DB.ResultatReq()
        DB.Close()

        listeVacances2 = []
        for id, nom, annee, date_debut, date_fin in listeVacances1:
            datedebut = datetime.date(int(date_debut[:4]),
                                      int(date_debut[5:7]),
                                      int(date_debut[8:10]))
            datefin = datetime.date(int(date_fin[:4]), int(date_fin[5:7]),
                                    int(date_fin[8:10]))
            listeVacances2.append(datedebut)
            for x in range((datefin - datedebut).days):
                datedebut = datedebut + datetime.timedelta(days=1)
                listeVacances2.append(datedebut)

        return listeVacances2

    def Importation_Feries(self):
        """ Importation des dates des jours fériés """

        req = "SELECT * FROM jours_feries;"
        DB = GestionDB.DB()
        DB.ExecuterReq(req)
        listeFeriesTmp = DB.ResultatReq()
        DB.Close()

        listeFeriesFixes = []
        listeFeriesVariables = []
        for ID, type, nom, jour, mois, annee in listeFeriesTmp:
            if type == "fixe":
                date = (jour, mois)
                listeFeriesFixes.append(date)
            else:
                date = datetime.date(annee, mois, jour)
                listeFeriesVariables.append(date)
        return listeFeriesFixes, listeFeriesVariables

    def Importation_categories_presences(self):
        DB = GestionDB.DB()
        req = "SELECT IDcategorie, nom_categorie FROM cat_presences"
        DB.ExecuterReq(req)
        listeCategories = DB.ResultatReq()
        DB.Close()
        # Transformation en dictionnaire
        dictCategories = {}
        for ID, nom in listeCategories:
            dictCategories[ID] = nom
        return dictCategories

    def OnBoutonAjouter(self, event):
        """ Créer un nouveau modèle """
        dlg = DLG_Saisie_modele.Dialog(self, IDmodele=0)
        dlg.ShowModal()
        dlg.Destroy()

    def OnBoutonModifier(self, event):
        """ Modifier un modèle """
        index = self.list_ctrl_modeles.GetFirstSelected()
        if index == -1:
            dlg = wx.MessageDialog(
                self,
                _(u"Vous devez sélectionner un modèle dans la liste proposée"
                  ), "Erreur", wx.OK)
            dlg.ShowModal()
            dlg.Destroy()
            return
        IDmodele = self.list_ctrl_modeles.GetItemData(index)
        dlg = DLG_Saisie_modele.Dialog(self, IDmodele=IDmodele)
        dlg.ShowModal()
        dlg.Destroy()

    def OnBoutonSupprimer(self, event):
        """ Suppression d'un modèle """
        index = self.list_ctrl_modeles.GetFirstSelected()
        if index == -1:
            dlg = wx.MessageDialog(
                self,
                _(u"Vous devez sélectionner un modèle dans la liste proposée"
                  ), "Erreur", wx.OK)
            dlg.ShowModal()
            dlg.Destroy()
            return
        IDmodele = self.list_ctrl_modeles.GetItemData(index)
        nomModele = self.list_ctrl_modeles.dictModeles[IDmodele][0]
        dlg = wx.MessageDialog(
            self,
            _(u"Souhaitez-vous vraiment supprimer le modèle '") + nomModele +
            "' ?", _(u"Suppression d'un modèle"),
            wx.ICON_QUESTION | wx.YES_NO | wx.NO_DEFAULT)
        if dlg.ShowModal() == wx.ID_NO:
            dlg.Destroy()
            return
        dlg.Destroy()

        if IDmodele in self.list_ctrl_modeles.selections:
            self.list_ctrl_modeles.selections.remove(IDmodele)

        DB = GestionDB.DB()
        # Suppression des taches associées au modèle
        DB.ReqDEL("modeles_taches", "IDmodele", IDmodele)
        # Suppression du modèle
        DB.ReqDEL("modeles_planning", "IDmodele", IDmodele)
        DB.Close()

        # MAJ listCtrl Modeles
        self.list_ctrl_modeles.Remplissage()
        self.boutonsEnabled(True, False, False)

    def OnBoutonDupliquer(self, event):
        """ Dupliquer un modèle """
        # Demande de confirmation
        index = self.list_ctrl_modeles.GetFirstSelected()
        if index == -1:
            dlg = wx.MessageDialog(
                self,
                _(u"Vous devez sélectionner un modèle dans la liste proposée"
                  ), "Erreur", wx.OK)
            dlg.ShowModal()
            dlg.Destroy()
            return
        IDmodele = self.list_ctrl_modeles.GetItemData(index)
        nomModele = self.list_ctrl_modeles.dictModeles[IDmodele][0]
        dlg = wx.MessageDialog(
            self,
            _(u"Souhaitez-vous vraiment dupliquer le modèle '") + nomModele +
            u"' ?", _(u"Duplication d'un modèle"),
            wx.ICON_QUESTION | wx.YES_NO | wx.NO_DEFAULT)
        if dlg.ShowModal() == wx.ID_NO:
            dlg.Destroy()
            return
        dlg.Destroy()

        # Duplication du modèle
        dlg = DLG_Saisie_modele.Dialog(self, IDmodele=IDmodele)
        dlg.IDmodele = 0
        dlg.text_nom.SetValue(_(u"Copie de %s") % nomModele)
        dlg.ShowModal()
        dlg.Destroy()
Пример #2
0
class Page(wx.Panel):
    def __init__(self, *args, **kwds):
        kwds["style"] = wx.TAB_TRAVERSAL
        wx.Panel.__init__(self, *args, **kwds)

        self.dictTypes = {}

        self.sizer_dates_staticbox = wx.StaticBox(self, -1, "Dates du contrat")
        self.sizer_caract_staticbox = wx.StaticBox(
            self, -1, _(u"Caractéristiques générales"))
        self.sizer_essai_staticbox = wx.StaticBox(self, -1,
                                                  _(u"Période d'essai"))
        self.label_titre = wx.StaticText(
            self, -1, _(u"2. Caractéristiques générales du contrat"))
        self.label_intro = wx.StaticText(
            self, -1,
            _(u"Saisissez les caractéristiques générales du contrat :"))

        self.label_type = wx.StaticText(self, -1, "Type de contrat :")
        self.choice_type = wx.Choice(self, -1, choices=[])
        self.Importation_Type()
        self.bouton_type = wx.Button(self, -1, "...", style=wx.BU_EXACTFIT)

        self.label_class = wx.StaticText(self, -1, "Classification :")
        self.choice_class = wx.Choice(self, -1, choices=[])
        self.Importation_classifications()
        self.bouton_class = wx.Button(self, -1, "...", style=wx.BU_EXACTFIT)

        self.label_valpoint = wx.StaticText(self, -1, "Valeur du point :")
        self.choice_valpoint = wx.Choice(self, -1, choices=[])
        self.Importation_valPoint()
        self.bouton_valpoint = wx.Button(self, -1, "...", style=wx.BU_EXACTFIT)

        self.label_date_debut = wx.StaticText(self, -1, "       A partir du :")
        self.datepicker_date_debut = DatePickerCtrl(self,
                                                    -1,
                                                    style=DP_DROPDOWN)
        self.label_date_fin = wx.StaticText(self, -1, "Jusqu'au :")
        self.datepicker_date_fin = DatePickerCtrl(self, -1, style=DP_DROPDOWN)
        self.datepicker_date_debut.Enable(False)
        self.datepicker_date_fin.Enable(False)

        self.check_rupture = wx.CheckBox(
            self, -1, _(u" Rupture anticipée du contrat au :"))
        self.datepicker_rupture = DatePickerCtrl(self, -1, style=DP_DROPDOWN)
        self.datepicker_rupture.Enable(False)

        self.label_essai = wx.StaticText(self, -1, _(u"    Nbre de jours :"))
        self.periode_essai = wx.SpinCtrl(self, -1, "", size=(60, -1))
        self.periode_essai.SetRange(0, 99)
        self.periode_essai.SetValue(0)
        self.aide_essai = wx.StaticText(
            self, -1, _(u"  (1 jour par semaine travaillée)"))
        self.aide_essai.SetForegroundColour('Grey')

        self.__set_properties()
        self.__do_layout()

        self.Bind(wx.EVT_BUTTON, self.OnBoutonClassifications,
                  self.bouton_class)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonValPoint, self.bouton_valpoint)
        self.Bind(wx.EVT_BUTTON, self.OnBoutonType, self.bouton_type)
        self.Bind(wx.EVT_CHOICE, self.OnChoiceType, self.choice_type)
        self.Bind(wx.EVT_CHECKBOX, self.OnCheckRupture, self.check_rupture)

        self.Affichage_dateFin()
        # Importation des données
        if self.GetGrandParent().dictContrats["IDcontrat"] != 0:
            self.Importation()

    def __set_properties(self):
        self.label_titre.SetFont(
            wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, ""))
        self.bouton_type.SetMinSize((20, 20))
        self.bouton_type.SetToolTip(
            wx.ToolTip(
                _(u"Cliquez ici pour ajouter, modifier ou supprimer des types de contrat"
                  )))
        self.bouton_class.SetMinSize((20, 20))
        self.bouton_class.SetToolTip(
            wx.ToolTip(
                _(u"Cliquez ici pour ajouter, modifier ou supprimer des classifications"
                  )))
        self.bouton_valpoint.SetMinSize((20, 20))
        self.bouton_valpoint.SetToolTip(
            wx.ToolTip(
                _(u"Cliquez ici pour ajouter, modifier ou supprimer des valeurs de points"
                  )))
        self.check_rupture.SetToolTip(
            wx.ToolTip(
                _(u"Cliquez ici pour saisir une date de fin de contrat si l'employeur ou le salarié ont mis fin prématurément au contrat."
                  )))

    def __do_layout(self):
        grid_sizer_base = wx.FlexGridSizer(rows=5, cols=1, vgap=10, hgap=10)
        sizer_dates = wx.StaticBoxSizer(self.sizer_dates_staticbox,
                                        wx.VERTICAL)
        grid_sizer_dates = wx.FlexGridSizer(rows=1, cols=4, vgap=10, hgap=10)
        grid_sizer_rupture = wx.FlexGridSizer(rows=1, cols=3, vgap=5, hgap=5)

        sizer_caract = wx.StaticBoxSizer(self.sizer_caract_staticbox,
                                         wx.VERTICAL)
        grid_sizer_caract = wx.FlexGridSizer(rows=3, cols=3, vgap=5, hgap=5)
        grid_sizer_base.Add(self.label_titre, 0, 0, 0)
        grid_sizer_base.Add(self.label_intro, 0, wx.LEFT, 20)
        grid_sizer_caract.Add(self.label_type, 0,
                              wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 0)
        grid_sizer_caract.Add(self.choice_type, 0, wx.EXPAND, 0)
        grid_sizer_caract.Add(self.bouton_type, 0, 0, 0)
        grid_sizer_caract.Add(self.label_class, 0,
                              wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 0)
        grid_sizer_caract.Add(self.choice_class, 0, wx.EXPAND, 0)
        grid_sizer_caract.Add(self.bouton_class, 0, 0, 0)
        grid_sizer_caract.Add(self.label_valpoint, 0,
                              wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 0)
        grid_sizer_caract.Add(self.choice_valpoint, 0, wx.EXPAND, 0)
        grid_sizer_caract.Add(self.bouton_valpoint, 0, 0, 0)
        grid_sizer_caract.AddGrowableCol(1)
        sizer_caract.Add(grid_sizer_caract, 1, wx.ALL | wx.EXPAND, 5)
        grid_sizer_base.Add(sizer_caract, 1, wx.LEFT | wx.EXPAND, 20)

        grid_sizer_dates.Add(self.label_date_debut, 0,
                             wx.ALIGN_CENTER_VERTICAL, 0)
        grid_sizer_dates.Add(self.datepicker_date_debut, 0, 0, 0)
        grid_sizer_dates.Add(self.label_date_fin, 0, wx.ALIGN_CENTER_VERTICAL,
                             0)
        grid_sizer_dates.Add(self.datepicker_date_fin, 0, 0, 0)
        sizer_dates.Add(grid_sizer_dates, 1, wx.ALL | wx.EXPAND, 5)

        grid_sizer_rupture.Add((90, 10), 1, wx.ALIGN_CENTER_VERTICAL, 0)
        grid_sizer_rupture.Add(self.check_rupture, 0, wx.ALIGN_CENTER_VERTICAL,
                               0)
        grid_sizer_rupture.Add(self.datepicker_rupture, 0,
                               wx.ALIGN_CENTER_VERTICAL, 0)
        sizer_dates.Add(grid_sizer_rupture, 1, wx.EXPAND, 0)

        grid_sizer_base.Add(sizer_dates, 1, wx.LEFT | wx.EXPAND, 20)

        sizer_essai = wx.StaticBoxSizer(self.sizer_essai_staticbox,
                                        wx.VERTICAL)
        grid_sizer_essai = wx.FlexGridSizer(rows=1, cols=3, vgap=5, hgap=5)
        grid_sizer_essai.Add(self.label_essai, 0,
                             wx.ALIGN_RIGHT | wx.ALIGN_CENTER_VERTICAL, 0)
        grid_sizer_essai.Add(self.periode_essai, 0, wx.ALIGN_CENTER_VERTICAL,
                             0)
        grid_sizer_essai.Add(self.aide_essai, 0, wx.ALIGN_CENTER_VERTICAL, 0)
        sizer_essai.Add(grid_sizer_essai, 1, wx.ALL | wx.EXPAND, 5)
        grid_sizer_base.Add(sizer_essai, 1, wx.LEFT | wx.EXPAND, 20)

        self.SetSizer(grid_sizer_base)
        grid_sizer_base.Fit(self)
        grid_sizer_base.AddGrowableCol(0)

    def Importation(self):
        """ Remplit les controles avec les données importées si c'est une modification """
        dictContrats = self.GetGrandParent().dictContrats

        # Controles Choice
        type = dictContrats["IDtype"]
        self.SelectChoice(self.choice_type, data=type)
        classification = dictContrats["IDclassification"]
        self.SelectChoice(self.choice_class, data=classification)
        valeur_point = dictContrats["valeur_point"]
        self.SelectChoice(self.choice_valpoint, data=valeur_point)

        # Radio et Date de Rupture
        if dictContrats["date_rupture"] != "":
            self.check_rupture.SetValue(True)
            self.datepicker_rupture.Enable(True)
            self.SetDatePicker(self.datepicker_rupture,
                               dictContrats["date_rupture"])
        else:
            self.check_rupture.SetValue(False)
            self.datepicker_rupture.Enable(False)

        # Dates de début et de fin
        date_debut = dictContrats["date_debut"]
        date_fin = dictContrats["date_fin"]
        if date_debut != "":
            self.SetDatePicker(self.datepicker_date_debut,
                               dictContrats["date_debut"])
        if date_fin != "" and date_fin != "2999-01-01":
            self.SetDatePicker(self.datepicker_date_fin,
                               dictContrats["date_fin"])
        self.datepicker_date_debut.Enable(True)
        self.datepicker_date_fin.Enable(True)

        if self.dictTypes[type] == "non":
            self.label_date_fin.Show(True)
            self.datepicker_date_fin.Show(True)
        else:
            self.label_date_fin.Show(False)
            self.datepicker_date_fin.Show(False)

        # Période d'essai
        essai = dictContrats["essai"]
        self.periode_essai.SetValue(essai)

    def CalcEssai(self):
        """ Calcule la durée de la période d'essai en fonction des dates du contrat """
        essai = 0

        # Si CDI
        if self.dictTypes[self.choice_type.GetClientData(
                self.choice_type.GetSelection())] == "oui":
            self.periode_essai.SetValue(30)
            return

        # Si CDD

        # Calcul de la durée du contrat
        date_tmp = self.datepicker_date_debut.GetValue()
        date_debut = datetime.date(date_tmp.GetYear(),
                                   date_tmp.GetMonth() + 1, date_tmp.GetDay())
        date_tmp = self.datepicker_date_fin.GetValue()
        date_fin = datetime.date(date_tmp.GetYear(),
                                 date_tmp.GetMonth() + 1, date_tmp.GetDay())

        if date_debut > date_fin:
            self.periode_essai.SetValue(0)
            return

        nbreJours = (date_fin - date_debut).days
        nbreSemaines = nbreJours // 7

        print(nbreJours, nbreSemaines)

        self.periode_essai.SetValue(essai)

    def SetDatePicker(self, controle, date):
        """ Met une date dans un datePicker donné """
        annee = int(date[:4])
        mois = int(date[5:7]) - 1
        jour = int(date[8:10])
        date = wx.DateTime()
        date.Set(jour, mois, annee)
        controle.SetValue(date)

    def OnCheckRupture(self, event):
        if self.check_rupture.GetValue() == True:
            self.datepicker_rupture.Enable(True)
        else:
            self.datepicker_rupture.Enable(False)

    def OnChoiceType(self, event):
        self.datepicker_date_debut.Enable(True)
        self.datepicker_date_fin.Enable(True)
        self.Affichage_dateFin()
        self.CalcEssai()

    def Affichage_dateFin(self):
        """ Faire apparaitre ou disparaitre le controle DateFin en fonction du type de contrat choisi """
        selection = self.choice_type.GetSelection()
        if selection != -1:
            IDselection = self.choice_type.GetClientData(selection)
        else:
            return
        if self.dictTypes[IDselection] == "non":
            self.label_date_fin.Show(True)
            self.datepicker_date_fin.Show(True)
        else:
            self.label_date_fin.Show(False)
            self.datepicker_date_fin.Show(False)

    def OnBoutonClassifications(self, event):
        dlg = DLG_Config_classifications.Dialog(self)
        dlg.ShowModal()
        dlg.Destroy()
        self.MAJ_choice_Class()

    def OnBoutonValPoint(self, event):
        dlg = DLG_Config_val_point.Dialog(self)
        dlg.ShowModal()
        dlg.Destroy()
        self.MAJ_choice_ValPoint()

    def OnBoutonType(self, event):
        dlg = DLG_Config_types_contrats.Dialog(self)
        dlg.ShowModal()
        dlg.Destroy()
        self.MAJ_choice_Type()

    def MAJ_choice_Class(self):
        self.Importation_classifications()

    def Importation_classifications(self):
        controle = self.choice_class
        selection = controle.GetSelection()
        IDselection = None
        if selection != -1: IDselection = controle.GetClientData(selection)
        # Récupération des données
        DB = GestionDB.DB()
        req = """SELECT * FROM contrats_class """
        DB.ExecuterReq(req)
        liste = DB.ResultatReq()
        DB.Close()
        # Placement de la liste dans le Choice
        controle.Clear()
        x = 0
        for key, valeur in liste:
            controle.Append(valeur, key)
            if IDselection == key: controle.SetSelection(x)
            x += 1

    def MAJ_choice_ValPoint(self):
        self.Importation_valPoint()

    def Importation_valPoint(self):
        controle = self.choice_valpoint
        selection = controle.GetSelection()
        IDselection = None
        if selection != -1: IDselection = controle.GetClientData(selection)
        # Récupération des données
        DB = GestionDB.DB()
        req = """SELECT * FROM valeurs_point ORDER BY date_debut """
        DB.ExecuterReq(req)
        liste = DB.ResultatReq()
        DB.Close()

        # Recherche de la valeur actuelle
        dateJour = str(datetime.date.today())
        valeurActuelle = None
        for ID, valeur, dateDebut in liste:
            if dateJour >= dateDebut:
                valeurActuelle = ID

        # Placement de la liste dans le Choice
        controle.Clear()
        x = 0
        for ID, valeur, dateDebut in liste:
            txt = str(valeur) + _(u" ¤  (à partir du "
                                  ) + FonctionsPerso.DateEngFr(dateDebut) + ")"
            controle.Append(txt, ID)
            # Sélection de l'ancienne valeur sélectionnée
            if IDselection == ID: controle.SetSelection(x)
            # Sélection de la valeur actuelle si rien n'a été sélectionnée
            if IDselection == None and valeurActuelle == ID:
                controle.SetSelection(x)
            x += 1

        self.listeValPoint = liste

    def MAJ_choice_Type(self):
        self.Importation_Type()

    def Importation_Type(self):
        controle = self.choice_type
        selection = controle.GetSelection()
        IDselection = None
        if selection != -1: IDselection = controle.GetClientData(selection)
        # Récupération des données
        DB = GestionDB.DB()
        req = """SELECT * FROM contrats_types """
        DB.ExecuterReq(req)
        liste = DB.ResultatReq()
        DB.Close()
        # Placement de la liste dans le Choice
        controle.Clear()
        self.dictTypes = {}
        x = 0
        for key, nom, nom_abrege, duree_indeterminee in liste:
            self.dictTypes[key] = duree_indeterminee
            controle.Append(nom, key)
            if IDselection == key: controle.SetSelection(x)
            x += 1

        if selection != -1: self.Affichage_dateFin()

    def GetDatePickerValue(self, controle):
        date_tmp = controle.GetValue()
        return str(
            datetime.date(date_tmp.GetYear(),
                          date_tmp.GetMonth() + 1, date_tmp.GetDay()))

    def GetChoiceData(self, controle):
        selection = controle.GetSelection()
        if selection != -1:
            IDselection = controle.GetClientData(selection)
        else:
            IDselection = None
        return IDselection

    def SelectChoice(self, controle, data):
        nbreItems = controle.GetCount()
        index = 0
        for item in range(nbreItems):
            if controle.GetClientData(index) == data:
                controle.SetSelection(index)
                return
            index += 1

    def Validation(self):

        # Récupération des valeurs saisies
        type = self.GetChoiceData(self.choice_type)
        classification = self.GetChoiceData(self.choice_class)
        valPoint = self.GetChoiceData(self.choice_valpoint)
        date_debut = self.GetDatePickerValue(self.datepicker_date_debut)
        date_fin = self.GetDatePickerValue(self.datepicker_date_fin)
        rupture = self.check_rupture.GetValue()
        date_rupture = self.GetDatePickerValue(self.datepicker_rupture)
        essai = self.periode_essai.GetValue()

        # Vérifie que des valeurs ont été saisies
        if type == None:
            dlg = wx.MessageDialog(
                self,
                _(u"Vous devez sélectionner un type de contrat dans la liste proposée."
                  ), "Erreur", wx.OK)
            dlg.ShowModal()
            dlg.Destroy()
            self.choice_type.SetFocus()
            return False

        if classification == None:
            dlg = wx.MessageDialog(
                self,
                _(u"Vous devez sélectionner une classification dans la liste proposée."
                  ), "Erreur", wx.OK)
            dlg.ShowModal()
            dlg.Destroy()
            self.choice_class.SetFocus()
            return False

        if valPoint == None:
            dlg = wx.MessageDialog(
                self,
                _(u"Vous devez sélectionner une valeur de point dans la liste proposée."
                  ), "Erreur", wx.OK)
            dlg.ShowModal()
            dlg.Destroy()
            self.choice_valpoint.SetFocus()
            return False

        # Vérifie que la date de fin est supérieure à la date de début de contrat
        if date_debut > date_fin and self.datepicker_date_fin.IsShown():
            dlg = wx.MessageDialog(
                self,
                _(u"La date de fin de contrat que vous avez saisie est inférieure à la date de début !"
                  ), "Erreur", wx.OK)
            dlg.ShowModal()
            dlg.Destroy()
            self.datepicker_date_fin.SetFocus()
            return False

        # Vérifie que la date de rupture est supérieure à la date de début de contrat
        if date_debut > date_rupture and rupture == True:
            dlg = wx.MessageDialog(
                self,
                _(u"La date de rupture de contrat que vous avez saisie est inférieure à la date de début !"
                  ), "Erreur", wx.OK)
            dlg.ShowModal()
            dlg.Destroy()
            self.datepicker_date_fin.SetFocus()
            return False

        # Vérifie que la date de rupture est supérieure à la date de début de contrat et inférieure à la date de fin si contrat à durée déterminée :
        if self.datepicker_date_fin.IsShown(
        ) and date_rupture >= date_fin and rupture == True:
            dlg = wx.MessageDialog(
                self,
                _(u"La date de rupture de contrat que vous avez saisie est égale ou supérieure à la date de fin de contrat !"
                  ), "Erreur", wx.OK)
            dlg.ShowModal()
            dlg.Destroy()
            self.datepicker_date_fin.SetFocus()
            return False

        # Vérifie que la valeur du point correspondant bien à la date de début de contrat
        valeurNecessaire = None
        for ID, valeur, dateValeur in self.listeValPoint:
            if date_debut >= dateValeur:
                valeurNecessaire = ID

        if valeurNecessaire == None:
            dlg = wx.MessageDialog(
                self,
                _(u"La valeur du point n'est pas correcte. Il n'existe pas dans la liste proposée de valeur correspondante à la date de début de contrat. \n\nVous devez donc créer une nouvelle valeur. \n\nSouhaitez-vous le faire maintenant ?"
                  ), "Erreur", wx.ICON_QUESTION | wx.YES_NO | wx.NO_DEFAULT)
            if dlg.ShowModal() == wx.ID_NO:
                dlg.Destroy()
                return False
            else:
                dlg.Destroy()
                self.OnBoutonValPoint(None)
                return False

        if valeurNecessaire != valPoint:
            dlg = wx.MessageDialog(
                self,
                _(u"La valeur du point ne correspond pas à la date de début du contrat. Vous devez sélectionner une autre valeur de points dans la liste proposée.\n\nVoulez-vous que je le fasse à votre place ?"
                  ), "Erreur", wx.ICON_QUESTION | wx.YES_NO | wx.NO_DEFAULT)
            if dlg.ShowModal() == wx.ID_NO:
                dlg.Destroy()
                return False
            else:
                dlg.Destroy()
                # Sélection automatique de la bonne valeur de point
                for index in range(self.choice_valpoint.GetCount()):
                    if self.choice_valpoint.GetClientData(
                            index) == valeurNecessaire:
                        self.choice_valpoint.SetSelection(index)
                        return False

        # Période d'essai
        if essai == "":
            dlg = wx.MessageDialog(
                self,
                _(u"Vous devez saisir un nombre de jours pour période d'essai."
                  ), "Erreur", wx.OK)
            dlg.ShowModal()
            dlg.Destroy()
            return False

        if essai == 0:
            dlg = wx.MessageDialog(
                self,
                _(u"Vous n'avez pas défini de période d'essai. \n\nSouhaitez-vous quand même continuer ? \n(Sinon cliquez 'non' ou 'annuler')"
                  ), "Erreur de saisie",
                wx.ICON_QUESTION | wx.YES_NO | wx.CANCEL | wx.NO_DEFAULT)
            if dlg.ShowModal() == wx.ID_YES:
                dlg.Destroy()
            else:
                dlg.Destroy()
                return False

        # Mémorisation des données
        dictContrats = self.GetGrandParent().dictContrats
        dictContrats["IDtype"] = type
        dictContrats["IDclassification"] = classification
        dictContrats["valeur_point"] = valPoint
        dictContrats["date_debut"] = date_debut
        if self.datepicker_date_fin.IsShown():
            dictContrats["date_fin"] = date_fin
        else:
            dictContrats["date_fin"] = "2999-01-01"
        if rupture == True:
            dictContrats["date_rupture"] = date_rupture
        else:
            dictContrats["date_rupture"] = ""
        dictContrats["essai"] = essai

        return True